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?


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

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%"

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ł :-)


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"
    

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

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

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.


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


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 ......

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.