2017-03-27 2 views
0

J'ai cette ligne dans un fichier .sh: easy_install -Z --prefix=$PREFIX *.eggfichier batch (.bat) équivalent à un script shell comme POSIX (Sh)

Maintenant, je travaille sur Windows et ai traduit cette commande à ce que je pense est la commande par lots fichier équivalent:

easy_install -Z --prefix=%PREFIX% *.egg 

Cependant, je reçois l'erreur suivante suivante (avec %PREFIX% contenant c:\path\to\site-packages):

Creating C:\path\to\site-packages\site.py 
error: Not a URL, existing file, or requirement spec: '*.egg' 
+1

Je connais peu de cmd, donc je ne suis pas sûr, mais une grande différence je pense est que les caractères génériques sont développés par le shell, tandis que cmd ne fait pas cette expansion. Cela signifie que dans shell easy_install reçoit une liste de fichiers correspondant à "* .egg", alors que sous windows cela ne se fait pas normalement. – linuxfan

Répondre

1

linxufan à condition que le pointeur cruciale:

Dans les fichiers batch Windows, la coque (cmd.exe) ne pas effectuer automatiquement englobement (extension des modèles de noms de fichiers (expressions génériques) à une liste de noms de fichiers correspondant).
Les commandes prenant en charge la globalisation sous Windows, telles que dir, l'implémentent elles-mêmes.

Au lieu de cela, littéral chaîne est passée à votre programme cible, ce qui n'est clairement pas l'intention ici.

Par conséquent, vous devez faire votre propre globbing et transmettre le résultat au programme cible.

Faire robuste dans un fichier batch est difficile, cependant; les travaux suivants sous l'hypothèse que vos noms ont ni intégrés" ni !: caractères

@echo off 
setlocal enabledelayedexpansion 

:: Do your own globbing and collect the filenames in variable %files%. 
set "files=" 
for %%f in (*.egg) do set files=!files! "%%f" 

easy_install -Z --prefix=%PREFIX% %files% 
  • setlocal enabledelayedexpansion est nécessaire afin que vous puissiez construire la variable itérativement %files% dans une boucle for (!...! variables -enclosed références sont alors dynamiquement étendu) - l'inconvénient est que ! chars. dans la valeur de la variable sont également interprétés.

  • Pour gérer également les noms de fichiers avec des espaces intégrés correctement, chaque nom de fichier est ajouté avec renfermant " caractères. - l'inconvénient est que les noms de fichiers avec " caractères incorporés. ne serait pas géré correctement, mais c'est rare.

Notez que si jamais il y a une chance que %PREFIX% contient des espaces ou d'autres métacaractères du shell, passer l'option double cité: "--prefix=%PREFIX%".