2009-11-07 9 views
6

Je ne sais pas comment décrire exactement ce que j'essaie de faire, mais voici un exemple de fichier batch qui montre ce que je ne peux pas comprendre:Comment définir une variable d'environnement sur une valeur avec des espaces dans un fichier batch?

J'ai un fichier batch. L'intérieur de ce fichier batch que je suis en train de créer un répertoire:

Set CopyFrom = %~dp0 

if Exist "%ProgramFiles(x86)" (
    Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces 
) 

md %TargetDir%\NewSubFolder 
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder 

Mon fichier batch échoue sur la ligne 4 Set TargetDir =... avec:

\My was unexpected at this time 

Je suppose que c'est parce que j'ai des espaces dans mon nom du chemin Je pensais que je pouvais envelopper ma variable avec des guillemets:

Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces" 

Mais quand je rentre à la ligne qui crée le répertoire échoue car %TargetDir% est maintenant entre guillemets doubles. Est-ce que cela peut être résolu ou devrais-je simplement écrire un VBScript pour trier les choses?

Répondre

6

Il suffit de mettre votre expression entre guillemets comme ceci:

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces" 
C:\>echo %TargetDir% 
C:\Program Files\My Directory Name has spaces 

Note: Il élargira la variable entre guillemets, et si elle a trop des espaces, il devra être cité.

Maintenant, vous pouvez citer pour effectuer votre opération:

md "%TargetDir%\NewSubFolder" 
+0

Merci, c'était juste le billet, très apprécié. – BobTheBuilder

+0

Il ne m'est jamais venu à l'esprit que je pourrais emballer l'ensemble de l'article après avoir placé entre guillemets ... bien sûr, ce n'est pas vraiment intuitif? – BobTheBuilder

+0

Non, pas intuitif. (Pas grand-chose à propos de la ligne de commande de Windows est - c'est pourquoi je suis passé à PowerShell). Je pense à ceci: les deux côtés du "=" sont un seul argument à la commande set. – zdan

2

Le problème en question ici sont pas les espaces que d'autres ont suggéré, mais plutôt la parenthèse fermante dans la variable d'environnement ProgramFiles(x86) Cela provoque l'analyseur penser que le bloc se termine prématurément (shameless self-promotion). Dans ce cas, ils aident l'analyseur à sauter par-dessus toute la partie citée et supposent, à juste titre, que la parenthèse suivante est la parenthèse fermante. mais le correctif pourrait être beaucoup plus facile que:

if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces 

Pourquoi utiliser un bloc du tout si parenthésée tout ce que vous faites exactement mettre une commande en elle?

set lui-même n'a pas besoin de guillemets, sauf lorsque ses arguments contiennent des caractères spéciaux comme <, >, |, qui & la coque elle-même gère aready. Ce n'est pas une panacée, bien que cela rende la manipulation de l'entrée de l'utilisateur ou du contenu du fichier une douleur parfois.

De même, ne placez jamais d'espaces autour du = dans une commande set. Cela entraînera la création d'une variable d'environnement avec son nom se terminant par un espace et son contenu commençant par un espace.Ceci a été partiellement corrigé dans Windows 7 en créant silencieusement à la fois la variable avec l'espace à la fin et un sans:

> set foo = bar 
> set foo 
foo=bar 
foo = bar 

Mais dans les versions précédentes de Windows cela ne se produit donc tout simplement jamais utiliser des espaces autour du = à moins vous savez c'est ce que vous voulez :-)

Questions connexes