Как использовать команду 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 не изменяет переменную среды. Что вызывает эту ошибку?

3 ответа

Решение

Ошибка командной строки 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 была удалена и больше не существует.

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

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

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

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

Мне очень нравится этот путь

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

@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 anaconda

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

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

2) установить python2 из командной строки anaconda: conda create -n python2 python = 2.7 anaconda

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

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

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

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

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

Другие вопросы по тегам