Ustaw zmienną ścieżki ze spacjami w ścieżce w pliku .cmd lub pliku wsadowym systemu Windows

112

Jestem nowy w pisaniu scenariuszy i nie mogę zmusić tego do pracy. Mógłbym, gdybym przeniósł pliki na ścieżkę bez spacji, ale chciałbym, aby działała z przestrzenią, jeśli to możliwe.

Chcę wyodrębnić kilka aktualizacji pakietu Office do folderu z plikiem cmd. Aby plik wsadowy działał na dowolnym komputerze, ustawiłem zmienną ścieżki, którą muszę zmienić tylko w jednym miejscu, aby uruchomić go na innym komputerze. Problem w tym, że ścieżka ma w sobie przestrzeń. Jeśli umieszczę cudzysłowy wokół ścieżki w definicji, cmd.exe umieści je wokół ścieżki przed dołączeniem nazwy pliku i przełączników, a partia zakończy się niepowodzeniem z komunikatem „Błąd składni wiersza polecenia”. Bez cudzysłowów kończy się niepowodzeniem, „nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy”.

Do testowania używam przełącznika pomocy do czasu, gdy mogę go uruchomić. Mogę to zrobić używając nazwy pliku / folderu 8.3 (np. My Documents as MyDocu ~ 1), ale czy można to zrobić w inny sposób?

marcerickson
źródło
Cudzysłowy muszą zawierać ścieżkę z nazwą pliku i parametrami wiersza poleceń. Czy możesz podać więcej szczegółów na temat tworzenia wiersza poleceń? Dokładnie, co masz na myśli, mówiąc> Jeśli umieszczę cudzysłowy wokół ścieżki w definicji, cmd.exe umieści je wokół ścieżki, zanim dołączy nazwę pliku i przełączy
vladhorby,

Odpowiedzi:

104

Spróbuj czegoś takiego:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2
aforia
źródło
To właśnie zrobiłem za pomocą Zamień w Notatniku. Dziękuję Ci.
marcerickson
5
Cieszę się, że pomogło. Byłoby miło, gdybyś zagłosował za i zaakceptował każdą odpowiedź, którą uważasz za pomocną.
aforia
75

używam

set "VAR_NAME=<String With Spaces>"

podczas aktualizacji ścieżki:

set "PATH=%UTIL_DIR%;%PATH%"
koko
źródło
3
powinna to być akceptowana odpowiedź. z jakiegoś powodu wywołanie set z bloku if nie działa, jeśli wartość ma spację i nie jest cytowana.
Kevin
33

Istnieją dwie opcje. Najpierw możesz zapisać ścieżkę bez cudzysłowu i po prostu zacytować ją później:

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

Inną opcją, której możesz użyć, jest podprogram, który sprzyja usuwaniu cytatów z ciągów znaków (ale w tym przypadku nie jest to w rzeczywistości dobry pomysł, ponieważ dodajesz cudzysłowy, usuwasz je i dodajesz ponownie bez korzyści):

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

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

%~1Usuwa cudzysłowy wokół argumentu. Przydaje się to przy przekazywaniu nazw folderów w cudzysłowie, ale, jak powiedziano wcześniej, w tym przypadku nie jest to najlepszy pomysł :-)

Joey
źródło
Użyłem pierwszej metody, używając Zamień w Notatniku. Drugi wydawał się niepotrzebnie skomplikowany. Dziękuję Ci.
marcerickson
2
Mam plik wsadowy, który pobiera parametry. U set LALA=%~1mnie działało używanie .
JCH2k
2. metoda działa perfeclty gdy używasz subrutines
robe007
16

Spróbuj tego;

  1. utwórz zmienną jak poniżej

    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
  2. Następnie zamień ścieżkę na zmienną. Pamiętaj, aby dodać cudzysłowy na początek i koniec

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    
Shiran Jayawardena
źródło
8

Kiedy tworzę plik .bat, zawsze umieszczam ścieżkę w podwójnych cudzysłowach. (Właśnie dodałem PAUSE, więc nie zamyka ekranu.)

Na przykład:

"C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
PAUSE
JoBaxter
źródło
7

Właściwy sposób na zrobienie tego jest następujący:

@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
źródło
5

Najłatwiejszym sposobem rozwiązania tego problemu jest umieszczenie nazwy folderu w cudzysłowie:

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

Mam nadzieję, że to pomoże.

user5528279
źródło
2

Jeśli chcesz zapisać stałą ścieżkę (ścieżka nie jest zmieniana po ponownym uruchomieniu cmd)

  1. Uruchom wiersz polecenia jako administrator (kliknij prawym przyciskiem myszy cmd.exe i wybierz Uruchom jako administrator)

  2. W cmd setx path "%path%;your new path" wpisz

  3. Sprawdź, czy ścieżka jest poprawnie wybrana, wpisując ścieżkę i naciskając klawisz Enter

mpmpeiris
źródło
1
Myślę, że pytanie nie dotyczy zmiennej PATH , ale raczej zmiennej ścieżki . OP najwyraźniej chce zapisać określoną ścieżkę w zmiennej i użyć wartości w skrypcie wsadowym.
Andriy M
1

po prostu spróbuj dodać podwójne ukośniki, tak jak to działa tylko dla mnie

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

@echo w MKDIR% dir%

OMG po opublikowaniu usunęli drugi \ w moim poście, więc jeśli otworzysz mój komentarz i pokazuje on trzy, powinieneś je przeczytać jako dwa ......

Erwin
źródło