2013-01-21 13 views
5

Próbuję utworzyć plik wsadowy systemu Windows, aby automatycznie ustawić zmienną środowiskową do używania Pythona 2.4 lub Pythona 3.3.Jak korzystać z polecenia setx w pliku wsadowym systemu Windows

Zarówno Python 2.4, jak i 3.3 są zainstalowane w moim systemie. Tu jest mój kodu:

::To toggle between Python24 and Python 33 
@echo on 
if (%PYTHONHOME:~-2%) == "24" (setx PYTHONHOME "C:\Python33" && setx PATH %PATH:Python24=Python33%) else (setx PYTHONHOME "C:\Python24" && setx PATH %PATH:Python33=Python24%) 
pause 

Na początek mam PYTHONHOME ustawiony C:\Python24

Ale Powyższy skrypt daje następujący błąd:

SUCCESS: Specified value was saved. 
ERROR: Invalid syntax. Default option is not allowed more than '2' time(s). 
Type "SETX /?" for usage. 

Moja PYTHONHOME nadal wskazuje python 24 i nic się nie zmienia. Polecenie setx nie zmienia zmiennej środowiskowej. Co powoduje ten błąd?

Odpowiedz

5

Błąd linii poleceń Windows:

ERROR: Invalid syntax. Default option is not allowed more than '2' time(s). 
Type "SETX /?" for usage. 

Podsumowanie:

Używasz polecenie setx i przypisując mu kilka żetonów, gdy tylko jedna jest dozwolona.

Jak odtworzyć ten błąd w systemie Windows:

otworzyć okna CMD terminal i wpisać te polecenia. To wyrzuca błąd:

C:\Users\Charity>setx FANCYPANTS string with spaces 

ERROR: Invalid syntax. Default option is not allowed more than '2' time(s). 
Type "SETX /?" for usage. 

zrobić to samo polecenie, ale podać swój ciąg tak:

C:\Users\Charity>setx FANCYPANTS "string with spaces quoted" 
SUCCESS: Specified value was saved. 
C:\Users\Charity> 

zmienna została ustawiona, uruchom terminal cmd tutaj, aby załadować zmiany.

C:\Users\Charity>echo %FANCYPANTS% 
string with spaces quoted 

Zmienna środowiskowa zostanie zapisana. Teraz go usuń.

C:\Users\Charity>setx FANCYPANTS "" 
SUCCESS: Specified value was saved. 

Ponownie uruchom cmd terminala tutaj, aby załadować zmiany. Wydrukuj zawartość ponownie.

C:\Users\Charity>echo %FANCYPANTS% 
%FANCYPANTS% 

zmienna FANCYPANTS została usunięta i już nie istnieje.

3

SETX wymaga wartości z odstępami do cytowania, a cudzysłowy w obrębie wartości muszą być oznaczone jako \".

Najlepiej używać opóźnionego rozszerzenia w celu ochrony przed znakami specjalnymi podczas fazy przetwarzania wsadowego.

Poniższe opcje nie tylko przestawiają wartości dla nowych sesji CMD, ale także przełączają wartość dla pozostałej części uruchamiania skryptu wsadowego. Niejawna ENDLOCAL na końcu skryptu powróci do starych wartości w bieżącej sesji po zakończeniu skryptu. W razie potrzeby skrypt można zmodyfikować, aby zachować nowe wartości poza barierą ENDLOCAL.

@echo on 
setlocal enableDelayedExpansion 
if "!PYTHONHOME:~-2!" == "24" (
    set "PYTHONHOME=C:\Python33" 
    set "PATH=!PATH:Python24=Python33!" 
) else (
    set "PYTHONHOME=C:\Python24" 
    set "PATH=!PATH:Python33=Python24!" 
) 
setx PYTHONHOME "!home!" 
setx PATH "!path:"=\"!" 
pause 
+1

Komendy 'setx' odwołują się do' newHome' i 'newPath', które nigdy wcześniej nie były przypisane. Czy zamiast tego użyłeś 'PYTHONHOME' i' PATH'? –

+0

@AndriyM - dzięki, wszystko naprawione. Zacząłem od używania "nowych" zmiennych, potem zmieniłem strategię bez pełnej konwersji. – dbenham

+0

Jak zachować wartości zmiennych po barierze ENDLOCAL? Napotkałem ten problem wcześniej i musiałem zapisać wartość do pliku ze zdrapką i przeczytać ją z powrotem, aby przejść przez barierę w przeszłości. – Jim2B

0

Komenda SETX jest bardzo zależna od składni polecenia. Poniższy przykład pokazuje Podstawowa składnia użyć, aby ustawić zmienną środowiskową Ścieżka:

SETX PATH "%PATH%;Path to new thing added" /M 

Będzie to również dodać nową ścieżkę do rejestru systemowego, ale nadal nie doda go do bieżącej sesji. Ponownie uruchom terminal, aby to zadziałało.

Powiązane problemy