2009-07-22 7 views
2

Il y a eu beaucoup de questions posées et de réponses sur les paramètres du fichier batch en ce qui concerne le% * mais je n'ai pas trouvé de réponse pour cela.l'équivalent du fichier de commandes de l'extension de paramètre unix avec des guillemets

Existe-t-il une syntaxe équivalente dans les fichiers batch qui peut effectuer le même comportement que "$ @" dans unix.

Certains contexte:

@echo off 
set MYPATH=%~dp0 
set PYTHON=%MYPATH%..\python\python 
set BASENAME=%~n0 
set XTPY=%MYPATH%..\SGTools\bin\%BASENAME%.py 
"%PYTHON%" "%XTPY%" %* 

Ceci est le fichier .bat qui est utilisé un proxy pour appeler un script python. Donc, je passe tous les paramètres (sauf le nom du script) au script python. Cela fonctionne bien jusqu'à ce qu'il y ait un paramètre entre guillemets et/ou contienne des espaces.

Dans les scripts shell, vous pouvez utiliser "$ @" pour prendre chaque paramètre et le placer entre guillemets. Y a-t-il quelque chose que je puisse faire pour reproduire ce processus?

Exemple Appels:

xt -T sg -t "path with possible spaces" -sum "name with spaces" -p <tool_name> -o lin32 lin64 win32 <lots of other options with possibilities of spaces> 

La xt commande/fichier contient simplement le code ci-dessus parce que l'exécutable réel est le code python dans un autre dossier. Donc le but est de créer un paquet autonome où vous n'ajoutez qu'un répertoire (répertoire xbin) à votre chemin.

+0

Faites-vous référence aux variables d'environnement que vous définissez ou au contenu de '% *'? Peux-tu donner quelques exemples? –

+0

@Keith_CE: Vous pouvez utiliser PowerShell et se débarrasser de toutes ces bêtises. –

+0

@Sinan Je fais référence au contenu de% *. L'exemple et l'explication ci-dessus aident-ils à avoir plus de sens? –

Répondre

3

Cela me rendait fou aussi. Je ne suis pas sûr de ce que la solution la plus propre est, mais voici comment je travaille autour du problème:

setlocal EnableDelayedExpansion  
for %%i in (%*) do set _args= !_args! "%%~i"  
echo %_args% 

% s% contiendra maintenant une liste cité de chaque paramètre. Par exemple, si vous avez appelé le fichier batch comme suit:

MYBATFILE "test'1'file" "test'2'file" "test 3 file"` 

echo% _args%

produira l'entrée cité d'origine. J'en avais besoin pour les fichiers CMD qui prennent des noms de fichiers ou de répertoires inamicaux et les transmettent aux scripts shell cygwin bash qui soulèvent beaucoup de problèmes, mais je ne pouvais pas me permettre de perdre les guillemets ou les espaces intégrés.

Notez le ~ i dans %% ~ i% qui est nécessaire pour supprimer les citations avant d'appliquer les guillemets. Lorsqu'un paramètre contenant des espaces est passé (par exemple, "fichier test 3" ci-dessus), le shell CMD aura déjà des guillemets appliqués. Le tilde ici s'assure que nous ne citons pas deux fois les paramètres contenant des espaces.

Espérons que cela aide!

Questions connexes