我正在尝试创建一个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命令不会更改环境变量。导致此错误的原因是什么?
答案 0 :(得分:6)
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已删除且不再存在。
答案 1 :(得分:3)
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
答案 2 :(得分:0)
SETX
命令非常依赖于命令的语法。以下示例显示了用于设置路径环境变量的基本语法:
SETX PATH "%PATH%;Path to new thing added" /M
这也将添加系统注册表的新路径,但仍不会为当前会话添加它。重新启动终端以使其生效。
答案 3 :(得分: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(不想在网络上允许点子网址:()
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%”,如果没有此行,新的会话将反映出更改