8

我正在尝试创建一个 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 命令不会更改环境变量。是什么导致了这个错误?

4

4 回答 4

9

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 被删除并且不再存在。

于 2013-08-11T22:49:57.247 回答
4

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
于 2013-01-21T17:37:29.350 回答
1

SETX命令非常依赖于命令的语法。以下示例显示了用于设置路径环境变量的基本语法:

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

这也会将新路径添加到系统注册表,但仍不会为当前会话添加它。重新启动终端以使其生效。

于 2014-09-26T08:52:58.663 回答
0

我真的很喜欢这种方式

这是批处理脚本:

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

并通过 GUI 将“%PYCURRENTPATHS%”添加到您的路径中: 路径

此示例使用此示例中的 anaconda 和 python2 设置: conda create -n python2 python=2.7 anaconda

所以对于超无痛的 Windows python,我不能推荐以下解决方案。请试一试,我想你会喜欢的。

1)使用Anaconda(本示例从python 3开始)......在最长的时间里我抵制并且在手动安装/管理python时运气更好,但由于网络问题,我被迫使用Anaconda(没有想要在网络上允许 pip url :( )

2) 从 anaconda 提示符安装 python2:conda create -n python2 python=2.7 anaconda

3) 创建上面的脚本以使您的 python 安装可用于命令行(例如添加到路径)

您可以添加更多虚拟 python 环境,在命令行中设置它们或增强此脚本(例如 PY2Tensor、Py3Scikit 等)或简单地通过 conda 管理它们 :)

Anaconda 受益于预编译的软件包。没有包不匹配、不稳定的版本、遗留问题或损坏的依赖关系。

我仍然更喜欢 Linux 进行开发,但如果你必须使用 windows 和 python,它会变得更好。

注意:在当前会话中设置 PATH=%PATH% 会导致重新评估“PATH”+“%PYCURRENTPATHS%”,新会话将反映没有此行的更改

于 2019-01-29T06:14:16.980 回答