Как использовать команду setx в пакетном файле Windows

Я пытаюсь создать пакетный файл Windows, чтобы автоматически установить переменную среды для использования python 2.4 или python 3.3.

В моей системе установлены оба Python 2.4 и 3.3. Вот мой код:

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

Для начала я установил PYTHONHOME на C:\Python24

Но приведенный выше скрипт выдает следующую ошибку:

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

Мой PYTHONHOME по-прежнему указывает на python 24, и ничего не изменилось. Команда setx не изменяет переменную среды. Что вызывает эту ошибку?


person Manmohan Singh    schedule 21.01.2013    source источник
comment
См. мой ответ на эту проблему здесь: superuser.com/a/1351153/439537   -  person Andrew    schedule 22.08.2018


Ответы (4)


Ошибка командной строки Windows:

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

Обзор:

Вы используете команду setx и назначаете ей несколько токенов, когда разрешен только один.

Как воспроизвести эту ошибку в Windows:

Откройте терминал Windows cmd и введите эти команды. Это вызывает ошибку:

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.

Выполните ту же команду, но укажите свою строку следующим образом:

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

Переменная была установлена, перезапустите терминал cmd здесь, чтобы загрузить изменения.

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

Переменная среды сохраняется. Теперь удалите его.

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

перезапустите терминал cmd здесь, чтобы загрузить изменения. Распечатайте содержимое еще раз.

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

переменная FANCYPANTS была удалена и больше не существует.

person Eric Leschinski    schedule 11.08.2013

SETX требует, чтобы значения с пробелами были заключены в кавычки, а кавычки внутри значения должны быть экранированы как \".

Лучше также использовать отложенное расширение для защиты от специальных символов на этапе пакетного анализа.

Следующее не только переключает значения для новых сеансов CMD, но также переключает значение для оставшейся части запуска пакетного сценария. Неявный ENDLOCAL в конце скрипта вернется к старым значениям в рамках текущего сеанса после завершения скрипта. При необходимости сценарий можно изменить, чтобы сохранить новые значения после барьера 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
person dbenham    schedule 21.01.2013
comment
Команды setx ссылаются на newHome и newPath, которые ранее никогда не назначались. Вы хотели вместо этого использовать PYTHONHOME и PATH? - person Andriy M; 22.01.2013
comment
@AndriyM - спасибо, все исправлено. Я начал с новых переменных, затем сменил стратегию без полной конвертации. - person dbenham; 22.01.2013
comment
Как сохранить значения переменных после барьера ENDLOCAL? Я сталкивался с этой проблемой раньше, и мне приходилось сохранять значение в файл с нуля и читать его обратно, чтобы преодолеть барьер в прошлом. - person Jim2B; 07.11.2015

Команда SETX очень зависит от синтаксиса команды. В следующем примере показан основной синтаксис для установки переменной среды пути:

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

Это также добавит новый путь в системный реестр, но не добавит его для текущего сеанса. Перезапустите терминал, чтобы он вступил в силу.

person diegeelvis_SA    schedule 26.09.2014

мне очень нравится этот способ

вот пакетный скрипт:

@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%PYCURRENTPATHS%

if not "x%str1:python2=%" == "x%str1%"  (
    set PYCURRENTPATHS=%PY3PATHS%
) else (
    set PYCURRENTPATHS=%PY2PATHS%
) 
setx PYCURRENTPATHS %PYCURRENTPATHS%
set PATH=%PATH%
endlocal

нам понадобятся 3 переменные: (используйте «set», чтобы установить текущий терминал, используйте «setx», чтобы установить постоянную переменную)

set PY2PATHS=D:\ProgramData\Anaconda3\env\python2;D:\ProgramData\Anaconda3\env\python2\Scripts
set PY3PATHS=D:\ProgramData\Anaconda3;D:\ProgramData\Anaconda3\Scripts
setx PY2PATHS %PY2PATHS%
setx PY3PATHS %PY3PATHS%
setx PYCURRENTPATHS %PY2PATHS%

И добавьте «%PYCURRENTPATHS%» к вашему пути через графический интерфейс: Пути

В этом примере используется установка anaconda и python2 из этого примера: conda create -n python2 python=2.7 анаконда

Поэтому для ультра безболезненного Windows python я не могу рекомендовать следующее решение. Пожалуйста, попробуйте, я думаю, вам понравится.

1) используйте Anaconda (начните с python 3 для этого примера)... долгое время я сопротивлялся и мне больше везло с ручной установкой/управлением python, но из-за проблем с сетью я был вынужден использовать Anaconda (не хотите разрешить адрес пипа в сети :()

2) установите python2 из приглашения anaconda: conda create -n python2 python=2.7 анаконда

3) создайте скрипт выше, чтобы сделать ваши установки python доступными для командной строки (например, добавить в путь)

Вы можете добавить больше виртуальных сред Python, установить их в командной строке или улучшить этот скрипт (например, PY2Tensor, Py3Scikit и т. д.) или просто управлять ими через conda :)

Anaconda использует предварительно скомпилированные пакеты. Никаких несоответствий пакетов, нестабильных выпусков, устаревших проблем или сломанных зависимостей.

Я по-прежнему предпочитаю Linux для разработки, но если вам приходится использовать Windows и Python, стало лучше.

Примечание: установка PATH=%PATH% приводит к переоценке "PATH" + "%PYCURRENTPATHS%" в текущем сеансе, новый сеанс отразит изменение без этой строки.

person James Nelson    schedule 29.01.2019