Impostare una variabile di percorso con spazi nel percorso in un file .cmd di Windows o in un file batch


112

Sono nuovo nella scrittura di sceneggiature e non riesco a far funzionare questo. Potrei se spostassi i file in un percorso senza uno spazio, ma vorrei che funzionasse con lo spazio, se possibile.

Voglio estrarre una serie di aggiornamenti di Office in una cartella con un file .cmd. Per rendere il file batch utilizzabile su qualsiasi computer, ho impostato una variabile di percorso che devo modificare solo in un punto per eseguirla su un'altra macchina. Il problema è che il percorso ha uno spazio al suo interno. Se inserisco virgolette attorno al percorso nella definizione, cmd.exe le inserisce nel percorso prima di aggiungere il nome del file e le opzioni e il batch non riesce con "Errore di sintassi della riga di comando". Senza virgolette, fallisce con "non è riconosciuto come comando interno o esterno, programma eseguibile o file batch".

Per i test, utilizzo l'interruttore della guida fino a quando o se riesco a farlo funzionare. Posso farlo usando un nome di file / cartella 8.3 (ad esempio Documenti come MyDocu ~ 1), ma può essere fatto in un modo diverso?


Le virgolette devono contenere il percorso con il nome del file e devono seguire i parametri della riga di comando. Puoi fornire ulteriori dettagli su come viene creata la riga di comando? Esattamente cosa intendi per> Se metto virgolette attorno al percorso nella definizione, cmd.exe le inserisce nel percorso prima di aggiungere il nome del file e cambiare
vladhorby

Risposte:


104

Prova qualcosa di simile:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2

Questo è quello che ho fatto usando Sostituisci nel Blocco note. Grazie.
marcerickson

5
Sono contento che abbia aiutato. Sarebbe bello se tu votassi e accettassi qualunque risposta pensi ti abbia aiutato.
aphoria

75

Io uso

set "VAR_NAME=<String With Spaces>"

durante l'aggiornamento del percorso:

set "PATH=%UTIL_DIR%;%PATH%"

3
questa dovrebbe essere la risposta accettata. per qualche ragione, chiamare set da un blocco if non funziona se il valore ha uno spazio e non è quotato.
Kevin

33

Ci sono due opzioni qui. Innanzitutto, puoi memorizzare il percorso senza virgolette e citarlo in un secondo momento:

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

Un'altra opzione che potresti usare è una subroutine che allude alle stringhe di annullamento delle virgolette (ma in questo caso non è in realtà una buona idea poiché stai aggiungendo virgolette, rimuovendole e aggiungendole di nuovo senza vantaggi):

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

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

Il %~1rimuove le virgolette attorno all'argomento. Questo è utile quando si passano i nomi delle cartelle tra virgolette ma, come detto prima, in questo caso particolare non è l'idea migliore :-)


Ho usato il primo metodo, usando Sostituisci nel Blocco note. Il secondo sembrava inutilmente complicato. Grazie.
marcerickson

2
Ho un file batch che ottiene i parametri. L'utilizzo set LALA=%~1era ciò che ha funzionato per me.
JCH2k

Il secondo metodo funziona perfettamente quando si utilizzano subrutine
robe007

16

Prova questo;

  1. creare una variabile come di seguito

    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
  2. Quindi sostituire il percorso con variabile. Assicurati di aggiungere virgolette per inizio e fine

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    

8

Metto sempre il percorso tra virgolette doppie quando creo un file .bat. (Ho appena aggiunto PAUSE in modo da non chiudere lo schermo.)

Per esempio:

"C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
PAUSE

7

Il modo corretto per farlo è così:

@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

5

Il modo più semplice per risolvere questo problema è mettere il nome della cartella tra virgolette:

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

Spera che questo aiuti.


2

Se è necessario memorizzare il percorso permanente (il percorso non viene modificato al riavvio di cmd)

  1. Esegui il prompt dei comandi come amministratore (fai clic con il pulsante destro del mouse su cmd.exe e seleziona Esegui come amministratore)

  2. In cmd setx path "%path%;your new path" quindi inserisci

  3. Verificare se il percorso è stato eseguito correttamente digitando path e premendo invio


1
Penso che la domanda non riguardi la variabile PATH , ma piuttosto una variabile di percorso . Apparentemente l'OP vuole memorizzare un particolare percorso in una variabile e utilizzare il valore attraverso lo script batch.
Andriy M

1

anche solo provare ad aggiungere doppie barre in questo modo funziona solo per me

set dir = "C: \\ 1. Some Folder \\ Some Other Folder \\ Just because"

@echo su MKDIR% dir%

OMG dopo aver postato hanno rimosso il secondo \ nel mio post quindi se apri il mio commento e ne mostra tre dovresti leggerli come due ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.