Définissez une variable de chemin avec des espaces dans le chemin dans un fichier .cmd ou un fichier de commandes Windows

112

Je suis nouveau dans l'écriture de scripts et je n'arrive pas à faire fonctionner celui-ci. Je pourrais si je déplaçais les fichiers vers un chemin sans espace, mais j'aimerais que cela fonctionne avec l'espace si cela pouvait.

Je souhaite extraire un tas de mises à jour Office dans un dossier contenant un fichier .cmd. Pour rendre le fichier de commandes utilisable sur n'importe quel ordinateur, j'ai défini une variable de chemin que je n'ai qu'à changer à un endroit pour l'exécuter sur une autre machine. Le problème est que le chemin contient un espace. Si je mets des guillemets autour du chemin dans la définition, cmd.exe les place autour du chemin avant d'ajouter le nom de fichier et les commutateurs et le lot échoue avec «Erreur de syntaxe de la ligne de commande». Sans guillemets, il échoue avec "n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes".

Pour les tests, j'utilise le commutateur d'aide jusqu'à ce que ou si je peux le faire fonctionner. Je peux le faire en utilisant un nom de fichier / dossier 8.3 (par exemple Mes documents comme MyDocu ~ 1), mais est-ce possible de le faire d'une manière différente?

marcerickson
la source
Les guillemets doivent contenir le chemin avec le nom du fichier et les paramètres de ligne de commande doivent suivre. Pouvez-vous donner plus de détails sur la création de la ligne de commande? Que voulez-vous dire exactement par> Si je mets des guillemets autour du chemin dans la définition, cmd.exe les met autour du chemin avant d'ajouter le nom de fichier et les commutateurs
vladhorby

Réponses:

104

Essayez quelque chose comme ceci:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2
aphorie
la source
C'est ce que j'ai fait en utilisant Replace in Notepad. Je vous remercie.
marcerickson
5
Heureux que cela ait aidé. Ce serait bien si vous votiez et acceptiez la réponse qui vous a aidé.
aphoria
75

j'utilise

set "VAR_NAME=<String With Spaces>"

lors de la mise à jour du chemin:

set "PATH=%UTIL_DIR%;%PATH%"
koko
la source
3
cela devrait être la réponse acceptée. pour une raison quelconque, l'appel de set à partir d'un bloc if ne fonctionne pas si la valeur a un espace et n'est pas entre guillemets.
Kevin
33

Il y a deux options ici. Tout d'abord, vous pouvez stocker le chemin sans guillemets et le citer plus tard:

set MyPath=C:\Program Files\Foo
"%MyPath%\foo with spaces.exe" something

Une autre option que vous pouvez utiliser est un sous-programme qui permet de supprimer les chaînes de caractères (mais dans ce cas, ce n'est en fait pas une très bonne idée puisque vous ajoutez des citations, les supprimez et les rajoutez à nouveau sans avantage):

set MyPath="C:\Program Files\Foo"
call :foo %MyPath%
goto :eof

:foo
"%~1\foo.exe"
goto :eof

Le %~1supprime les guillemets autour de l'argument. Cela est pratique lorsque vous passez des noms de dossiers entre guillemets mais, comme dit précédemment, dans ce cas particulier, ce n'est pas la meilleure idée :-)

Joey
la source
J'ai utilisé la première méthode, en utilisant Replace in Notepad. Le second semblait inutilement compliqué. Je vous remercie.
marcerickson
2
J'ai un fichier Batch qui obtient des paramètres. En utilisantset LALA=%~1 était ce qui fonctionnait pour moi.
JCH2k
La 2ème méthode fonctionne parfaitement lorsque vous utilisez des sous
programmes
16

Essaye ça;

  1. créer une variable comme ci-dessous

    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
  2. Remplacez ensuite le chemin par variable. Assurez-vous d'ajouter des guillemets pour le début et la fin

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    
Shiran Jayawardena
la source
8

Je place toujours le chemin entre guillemets lorsque je crée un fichier .bat. (Je viens d'ajouter la PAUSE pour qu'elle ne ferme pas l'écran.)

Par exemple:

"C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
PAUSE
JoBaxter
la source
7

La bonne façon de procéder est la suivante:

@ECHO off
SET MY_PATH=M:\Dir\^
With Spaces\Sub Folder^
\Dir\Folder
:: calls M:\Dir\With Spaces\Sub Folder\Dir\Folder\hello.bat
CALL "%MY_PATH%\hello.bat"
pause
Djangofan
la source
5

Le moyen le plus simple de résoudre ce problème est de mettre le nom du dossier entre guillemets:

(cd\New Folder\...) --> (cd\"New Folder"\...)

Espère que cela aide.

user5528279
la source
2

Si vous avez besoin de stocker un chemin permanent (le chemin n'est pas modifié lorsque cmd est redémarré)

  1. Exécutez l'invite de commande en tant qu'administrateur (cliquez avec le bouton droit sur cmd.exe et sélectionnez exécuter en tant qu'administrateur)

  2. Dans cmd setx path "%path%;your new path" puis entrez

  3. Vérifiez si le chemin est pris correctement en tapant chemin et en appuyant sur Entrée

mpmpeiris
la source
1
Je pense que la question ne concerne pas la variable PATH , mais plutôt une variable de chemin . L'OP souhaite apparemment stocker un chemin particulier dans une variable et utiliser la valeur dans le script batch.
Andriy M
1

essayez également d'ajouter des doubles barres obliques comme cela ne fonctionne que pour moi

set dir = "C: \\ 1. Un dossier \\ Un autre dossier \\ Juste parce que"

@echo sur MKDIR% dir%

OMG après avoir posté, ils ont supprimé le deuxième \ dans mon message, donc si vous ouvrez mon commentaire et qu'il en montre trois, vous devriez les lire comme deux ......

Erwin
la source