2017-10-20 43 views
0

je la commande suivante forComment citer des espaces dans la commande d'un « pour/F » boucle sous Windows

for /F %s in ('"mas ter\gradlew.bat" -q -p mass ter') do echo %s 

Et je ne comprends pas qu'il fonctionne correctement. Ce n'est pas le cas d'utilisation réel, mais un exemple très simplifié.

exécution

"mas ter\gradlew.bat" -q -p "mas ter" 

fonctionne très bien,

"mas ter\gradlew.bat" -q -p mass ter 

dit que le projet direcotry "masse" n'existe pas (extra "s" pour distinguisihing fin seulement),

mas ter\gradlew.bat -q -p mass ter 

indique que la commande "mas" n'a pas été trouvée. Jusqu'ici attendu, mais maintenant je veux le faire fonctionner dans la boucle for.

for /F %s in ('mas ter\gradlew.bat -q -p mass ter') do echo %s 

bien sûr dit à nouveau cette commande « mas » n'a pas été trouvé,

for /F %s in ('"mas ter\gradlew.bat" -q -p mass ter') do echo %s 

bien sûr dit à nouveau ce projet direcotry « masse » n'existe pas, mais maintenant il vient,

for /F %s in ('"mas ter\gradlew.bat" -q -p "mass ter"') do echo %s 

indique à nouveau que la commande "mas" n'a pas été trouvée. o_O

Et maintenant je suis au wtf.
Pourquoi cela se produit-il et comment le faire fonctionner?
Il ne fonctionne pas non plus pour échapper les espaces avec ^ caractères.
En outre, cela ne contribuerait pas, parce que les deux chemins sont stockés dans les paramètres et sont utilisés comme

for /F %s in ('"%script_path%\gradlew.bat" -q -p "%script_path%"') do echo %s 

Répondre

1

Ce fut vraiment un frustrant parce que l'analyse syntaxique de commande est bizarre

('"mas ter\gradlew.bat" -q -p mass ter') 

mais vous ne pouvez pas avoir des guillemets doubles dans la première et tout autre param

('"mas ter\gradlew.bat" -q -p "mass ter"') 

Quelque chose de bien ci-dessous va travailler

('master\gradlew.bat -q -p mass ter') 

Alors je suis venu avec peu de choses pour que cela fonctionne

par ams.bat

Un fichier avec l'espace dans le nom et l'écho chaque paramètre.Je crée aussi une copie de même que params.bat

@echo off 
echo "You sent '%*'" 
set argC=0 
for %%x in (%*) do (
    Set /A argC+=1 
    echo %argC% is %%x 
) 
echo %argC% 

F:\params.sh>"par ams.bat" 1 2 "ab c" 
"You sent '1 2 "ab c"'" 
0 is 1 
0 is 2 
0 is "ab c" 
3 

je pas pris la peine sur la fixation de l'indice des paramètres tant que décompte final m'a montré tout

maintenant un fichier à tester la configuration

@echo off 

for /F "tokens=* delims=" %%s in (params.bat " -q" " -p " "abc"`) do echo %%s 

cela a fonctionné grand

"You sent '" -q" " -p " "abc"'" 
0 is " -q" 
0 is " -p " 
0 is "abc" 
3 

suivant était d'essayer par ams.bat. J'ai essayé différentes variations

for /F "tokens=* delims=" %%s in ('par ams.bat " -q" " -p " "abc"') do echo %%s 
for /F "tokens=* delims=" %%s in ('"par ams.bat" " -q" " -p " "abc"') do echo %%s 
for /F "tokens=* delims=" %%s in ('par ams.bat' " -q" " -p " "abc"') do echo %%s 
for /F "tokens=* delims= usebackq" %%s in (`'par ams.bat' " -q" " -p " "abc"`) do echo %%s 
for /F "tokens=* delims= usebackq" %%s in (`"par ams.bat" " -q" " -p " "abc"`) do echo %%s 

Et rien de ce qui précède n'a fonctionné. Donc, la conclusion était que premier param sans espace, puis tout param avec espace ou des citations, pas de problèmes. Alors je suis venu avec un fichier de commandes supplémentaires

de escape.bat

@echo off 
SET COMMAND=%~1 
SHIFT 
%COMMAND %%* 

Le fichier ne fait rien, mais prend d'abord paramètre comme quoi exécuter et les arguments de ligne de commande pour le même. Et maintenant, je mis à jour le test à utiliser

for /F "tokens=* delims=" %%s in ('escape.bat "par ams.bat" " -q" " -p " "abc"') do echo %%s 

Et cela a fonctionné

F:\params.sh>test 
"You sent '" -q" " -p " "abc"'" 
0 is " -q" 
0 is " -p " 
0 is "abc" 
3 

Modifier-1: Utiliser appel au lieu de escape.bat

Merci pour les commentaires sur ce @ Vampire. Donc, une meilleure façon est d'utiliser call au lieu d'un escape.bat. Vous pouvez également obtenir le répertoire de script en utilisant set script_dir=%~dp0, puis utilisez la même chose dans votre fichier de commandes. Nous allons donc changer

for /F "tokens=* delims=" %%s in ('escape.bat "par ams.bat" " -q" " -p " "abc"') do echo %%s 

à

set script_name=%~dp0 
for /F "tokens=* delims=" %%s in ('call "%script_name%\par ams.bat" " -q" " -p " "abc"') do echo %%s 
+0

Merci pour les commentaires @Vampire, alors probablement pourquoi ne pas utiliser 'set script_dir =% ~ sdp0' pour obtenir 8,3 nom et pas besoin d'appel aussi? –

+0

Une question maintenant supprimée a également suggéré 8.3 noms, malheureusement ils peuvent être désactivés et même s'ils sont activés, seuls les chemins nouvellement créés en obtiennent un. Pour moi. g. C les a activés, D désactivé et je ne l'ai pas fait intentionnellement. Donc, l'utilisation de noms 8.3 n'est pas très fiable. Sinon, cela aurait été une solution valable, car alors vous n'auriez jamais besoin de guillemets autour de la commande. – Vampire