如何在Windows批处理文件中使用setx命令

时间:2013-01-21 16:15:13

标签: windows batch-file environment-variables setx

我正在尝试创建一个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 个答案:

答案 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%”添加到您的路径中: Paths

此示例使用此示例中的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%”,如果没有此行,新的会话将反映出更改