J'essaie d'éviter d'utiliser SETLOCAL enabledelayedexpansion ... ENDLOCAL
tous (ou presque tous) le temps, parce que généralement je veux définir ou modifier quelques variables et je veux que les nouvelles valeurs soient disponibles dans d'autres régions du script ou après la Le script de lot se termine (SETLOCAL | ENDLOCAL oubliera toutes les nouvelles variables ou les changements de variables dans la partie "SETLOCAL" du script.) Parfois, c'est pratique, mais pour moi, je trouve que ce n'est généralement pas le cas. par @Zuzel, mais avant que je savais sur cette méthode, je l'habitude d'utiliser ceci, qui est très similaire (mais semble un peu plus compliqué):
for /F "usebackq delims=" %%f in (`echo set "a=^%a:%b%=%c%^%"`) do @%%f
exemple de script:
@echo off
set a=The fat cat
set b=fat
set c=thin
@echo.
@echo before: "%a%"
@echo replace "%b%" with "%c%" in "%a%" using for:
for /F "usebackq delims=" %%f in (`echo set "a=%%a:%b%=%c%%%"`) do @%%f
@echo after for: "%a%"
goto :EOF
la sortie de l'exécution du script:
before: "The fat cat"
replace "fat" with "thin" in "The fat cat" using for:
after for: "The thin cat"
J'aime cette méthode parce que vous pouvez appeler des programmes externes (ou des commandes internes) en utilisant des variables modifiées et également capturer et traiter la sortie de la commande (ligne par ligne). Mais la méthode de Zuzel est plus simple et plus propre pour la plupart des situations, y compris celle que vous avez décrite.
Note:
Ces deux méthodes (et SETLOCAL enabledelayedexpansion ... ENDLOCAL
, bien sûr), ne fonctionnera correctement que si elle est exécutée à partir d'un script batch. Si vous essayez d'utiliser l'une de ces deux méthodes ("appel" ou "pour") directement dans une fenêtre d'invite de commande, vous obtiendrez quelque chose de différent de ce que la sortie exécutait à partir d'un script.
Par exemple, exécutez comme un script:
@echo off
set a=The fat cat
set b=fat
set c=thin
set d=calico
set e=sleepy
@echo.
@echo before: "%a%"
@echo.
@echo replace "%b%" with "%c%" in "%a%" using call:
call set a=%%a:%b%=%c%%%
@echo after call: "%a%" ("%b%" to "%c%")
@echo.
@echo replace "%c%" with "%d%" in "%a%" using for:
for /F "usebackq delims=" %%f in (`echo set "a=%%a:%c%=%d%%%"`) do @%%f
@echo after for: "%a%" ("%c%" to "%d%")
@echo.
@echo replace "%d%" with "%e%" in "%a%" using call:
call set a=%%a:%d%=%e%%%
@echo after call: "%a%" ("%d%" to "%e%")
la sortie de l'exécution du script:
before: "The fat cat"
replace "fat" with "thin" in "The fat cat" using call:
after call: "The thin cat" ("fat" to "thin")
replace "thin" with "calico" in "The thin cat" using for:
after for: "The calico cat" ("thin" to "calico")
replace "calico" with "sleepy" in "The calico cat" using call:
after call: "The sleepy cat" ("calico" to "sleepy")
Maintenant, exécutez les commandes directement dans une fenêtre d'invite:
c:\>
c:\>set a=The fat cat
c:\>set b=fat
c:\>set c=thin
c:\>set d=calico
c:\>set e=sleepy
c:\>
c:\>@echo.
c:\>@echo before: "%a%"
before: "The fat cat"
c:\>@echo.
c:\>
c:\>@echo replace "%b%" with "%c%" in "%a%" using call:
replace "fat" with "thin" in "The fat cat" using call:
c:\>call set a=%%a:%b%=%c%%%
c:\>@echo after call: "%a%" ("%b%" to "%c%")
after call: "%The thin cat%" ("fat" to "thin")
c:\>
c:\>@echo.
c:\>@echo replace "%c%" with "%d%" in "%a%" using for:
replace "thin" with "calico" in "%The thin cat%" using for:
c:\>for /F "usebackq delims=" %f in (`echo set "a=%%a:%c%=%d%%%"`) do @%f
c:\>@echo after for: "%a%" ("%c%" to "%d%")
after for: "%%The calico cat%%" ("thin" to "calico")
c:\>
c:\>@echo.
c:\>@echo replace "%d%" with "%e%" in "%a%" using call:
replace "calico" with "sleepy" in "%%The calico cat%%" using call:
c:\>call set a=%%a:%d%=%e%%%
c:\>@echo after call: "%a%" ("%d%" to "%e%")
after call: "%%%The sleepy cat%%%" ("calico" to "sleepy")
c:\>
examine les lignes de sortie avant et après à partir de la fenêtre d'invite de commande:Remarquez que les substitutions sont effectuées correctement, mais notez également qu'en exécutant ces commandes directement dans la fenêtre d'invite de commande, il ajoute un ensemble de «%» (signes de pourcentage) avant et après la valeur attendue à chaque fois. la substitution est faite. Ainsi, il est difficile de tester l'une de ces méthodes directement dans la fenêtre d'invite de commande.
Je me attends à ce comportement, mais je aussi Attendez-vous à un moyen de retarder l'expansion ou d'imbriquer l'expansion. BTW, je suis d'accord, rien n'est facile, ni immédiatement évident dans DOS. – GKelly