2009-09-15 7 views
0

le fichier de commandes:Dans un fichier batch, est-il possible de remplacer cette utilisation de SED et TR par une boucle for?

@echo. 
@set curdrive=%~d0 
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n 
@echo. 

sortie de l'échantillon (un élément de trajet pour chaque ligne):

C:\cheeso\bin 
C:\Perl\bin 
c:\utils 
C:\Windows\system32 
C:\Windows 
C:\Windows\System32\Wbem 
c:\Program Files\Microsoft SQL Server\90\Tools\binn\ 
c:\.net3.5 
c:\.net2.0 
c:\vs2008\common7\IDE 
c:\netsdk2.0\bin 

Ce fichier de commandes dépend de la sed.exe et la tr.exe de UnxUtils. Je voudrais faire la même chose en utilisant seulement les commandes intégrées et les programmes inclus avec Windows. Puis-je le faire? Astuces?

Répondre

1
setlocal 
SET _Path="%Path:;=";"%" 
FOR %%a IN (%_Path%) DO ECHO  %%~a 
endlocal 
1

Attention, l'abus de récursion avant:

@echo off 

call :one "%PATH%" 
goto :eof 

:one 
for /f "tokens=1,* delims=;" %%i in (%1) do (
    echo %%i 
    if not "%%j"=="" call :one "%%j" 
) 
+1

utilisateur "Jay" a une excellente alternative ici: http://stackoverflow.com/questions/817280/how-does-for-work-in -cmd-batch-file/1293667 # 1293667 –

1

est ici une version non récurrente. Pas vraiment mieux, mais je me sentais comme à la recherche d'une autre solution:

SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS 
:again 
FOR /F "delims=;" %%I IN ("%PATH%") DO ECHO %%I & SET PATH=!PATH:%%I;=! 
IF DEFINED PATH GOTO :again 
ENDLOCAL 

Je crois que cela ne fonctionne que pour Windows XP, 2003 Server et plus récent.

+0

Avez-vous essayé d'exécuter ceci? Il imprime juste la première valeur dans une boucle infinie. La boucle "for" ne réévalue pas l'expression en parens. –

+0

@Adam - oui, cela fonctionne très bien sur Windows 2003. Vous avez raison en ce que la boucle 'FOR' sort le premier élément. Ensuite, il supprime l'élément de 'PATH'. Le 'IF DEFINED' est exécuté chaque fois que le chemin n'est pas vide. Soyez prudent lorsque vous tapez l'instruction 'SET'. –

+0

Beaucoup mieux que la version UnxUtils, et je l'aime mieux que l'evrsion récursif, aussi. Mais cela n'a pas fonctionné pour moi, jusqu'à ce que j'ajoute un final se terminant; sur le chemin. – Cheeso

0

j'ai commencé à utiliser:

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS 
set tpath=%path%; 
echo. 
:again 
FOR /F "delims=;" %%I IN ("%TPATH%") DO (
    echo %%I 
    set TPATH=!TPATH:%%I;=! 
) 
IF DEFINED TPATH GOTO :again 

ENDLOCAL 

Mais alors décidé que c'était plus simple:

setlocal 
set _path="%PATH:;=" "%" 
for %%p in (%_path%) do if not "%%~p"=="" echo  %%~p 
endlocal 
+0

Crédit lorsque le crédit est dû. Le plus simple est l'exemple de Jay ici: http://stackoverflow.com/questions/817280/how-does-for-work-in-cmd-batch-file/1293667#1293667 –

0

J'ai essayé sur mon serveur Windows 2003 et cela a fonctionné. Voici le contenu de mon showpath.cmd:

@echo off 
for %%p in (%PATH%) do echo %%p 
+0

Cela ne fonctionne pas pour mon chemin , car mon chemin inclut des noms de répertoire contenant des espaces. Ainsi, "C: \ Program Files \ Outils Power Team Team Foundation Server 2008" s'affiche sur 8 lignes. – Cheeso

Questions connexes