77 votes

Traiter les citations dans les scripts batch de Windows

Dans un fichier de commandes Windows, lorsque vous effectuez les opérations suivantes:

set myvar="c:\my music & videos"

la variable myvar est stockée avec les guillemets inclus. Honnêtement, je trouve cela très stupide. Les guillemets sont juste pour dire où la chaîne commence et se termine, pas pour être stockés dans le cadre de la valeur elle-même.
Comment puis-je empêcher que cela se produise?

Merci.

75voto

RuskoGuyachev Points 41
 set "myvar=c:\my music & videos"
 

Remarquez que les guillemets commencent avant myvar. C'est en fait aussi simple que cela. Note latérale: myvar ne peut pas être répercuté par la suite sauf s'il est entouré de guillemets car & sera lu comme un séparateur de commandes, mais cela fonctionnera toujours comme un chemin.

http://ss64.com/nt/set.html sous "Les noms de variables peuvent inclure des espaces"

66voto

Craig Rorrer Points 181

C'est la bonne façon de procéder:

 set "myvar=c:\my music & videos"
 

Les guillemets ne seront pas inclus dans la valeur de la variable.

36voto

Patrick Cuff Points 13362

Cela dépend de comment vous voulez utiliser la variable. Si vous voulez juste utiliser la valeur de la variable sans les guillemets, vous pouvez utiliser soit retardé l'expansion et de remplacement de chaîne de caractères, ou l' for commande:

@echo OFF
SETLOCAL enabledelayedexpansion

set myvar="C:\my music & videos"

Comme andynormancx les états, les guillemets sont nécessaires puisque la chaîne contient l' &. Ou vous pouvez vous échapper avec l' ^, mais je pense que les citations sont un peu plus propre.

Si vous utilisez l'expansion retardée avec substitution de chaîne, vous obtenez la valeur de la variable, sans les guillemets:

@echo !myvar:"=!
>>> C:\my music & videos

Vous pouvez également utiliser l' for commande:

for /f "tokens=* delims=" %%P in (%myvar%) do (
    @echo %%P
)
>>> C:\my music & videos

Cependant, si vous souhaitez utiliser la variable dans une commande, vous devez utiliser la valeur boursière ou de joindre la valeur de la variable entre guillemets:

  1. L'aide de la chaîne de substitution et de l'expansion retardée à l'utilisation de la valeur de la variable sans les guillemets, mais l'utilisation de la variable dans la commande:

    @echo OFF
    SETLOCAL enabledelayedexpansion
    
    
    set myvar="C:\my music & videos"
    md %myvar%
    @echo !myvar:"=! created.
    
  2. À l'aide de l' for commande à utiliser la valeur de la variable sans les guillemets, mais vous devrez vous entourer la variable avec des guillemets lorsque vous les utilisez dans les commandes:

    @echo OFF
    set myvar="C:\my music & videos"
    
    
    for /f "tokens=* delims=" %%P in (%myvar%) do (
        md "%%P"
        @echo %%P created.
    )
    

Longue histoire courte, il n'y a vraiment aucun moyen propre à utiliser un chemin d'accès ou le nom de fichier contient des espaces et/ou &s dans un fichier de commandes.

7voto

Binary Worrier Points 27424

L'utilisation de jscript.

Il ya de nombreuses lunes (soit environ 8 ans, donner ou prendre) je travaillais sur un grand C++/VB6 projet, et j'ai eu divers éléments de Script Batch pour faire des parties de la construction.

Puis quelqu'un m'a signalé au Test de Joël, j'ai été particulièrement satisfait du point 2, et rassembler tous mes petits scripts en un seul script de construction . . .

et il a presque brisé mon coeur, l'obtention de tous ces petits scripts de travailler ensemble, sur des machines différentes, avec un peu de configurations différentes, vous, les Dieux, c'était horrible, en particulier de la définition de variables et de passage de paramètres. C'était vraiment fragile, la moindre chose serait de les casser et 30 minutes de peaufinage de repartir.

Enfin, je peux être têtu moi - je chucked l'ensemble du lot et dans environ un jour ré-écrit tout en JavaScript, de courir à partir de l'invite de commande avec CScript.

Je n'ai pas regardé en arrière. Bien que ces jours, il est MSBuild et régulateur de vitesse, si j'ai besoin de faire quelque chose, même légèrement impliqué avec un script batch, j'utilise jscript.

0voto

andynormancx Points 6026

Vous devez avoir les guillemets si le texte de réglage comprend certains caractères, y compris les &. Si votre texte ne comprend pas & puis vous n'auriez pas besoin de guillemets.

Par exemple, si le texte était juste "c:\my de la musique", alors vous pourriez faire:

set myvar = c:\my music

Mais parce que votre texte a un & vous avez besoin de la cite.

Edit:

Ou comme Dave l'a dit dans sa réponse, vous pouvez échapper au problème de caractères avec ^^^, mais méfiez-vous de cette approche & n'est pas le seul personnage vous devez vous échapper. Dans la pratique, il est beaucoup plus facile de coller avec les citations plutôt que d'échapper à toute le problème des caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X