我正在关注教程设置 Apache Storm。(这只是为了说明一下背景情况——这对我的错误来说并不重要。)
因此它告诉我设置一些环境变量,具体来说分别是%JAVA_HOME%
和。我以前从未做过这种事,所以我查找了如何做到这一点,然后我运行了:%STORM_HOME%
C:\Java\jdk1.8.0_60\
C:\storm-0.9.1-incubating-SNAPSHOT-12182013\
C:\>setx %JAVA_HOME% C:\JAVA\jdk1.8.0_60\
并给出了:SUCCESS: Specified value was saved.
然后我做了:
C:\>setx %STORM_HOME% C:\storm-0.9.1-incubating-SNAPSHOT-12182013\
并给出了同样的东西:SUCCESS: Specified value was saved.
然后教程说要添加%STORM_HOME%\bin;%JAVA_HOME%\bin;C:\Python27;C:\Python27\Lib\site-packages\;C:\Python27\Scripts\;
到PATH
。我输入C:\>PATH
以查看它当前是什么,它给出了:
PATH=C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\
所以我想我可以通过以下方式添加它
C:\>setx PATH C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;%STORM_HOME%\bin;%JAVA_HOME%\bin;C:\Python27;C:\Python27\Lib\site-packages\;C:\Python27\Scripts\;
换句话说,我刚刚尝试调用setx
,PATH
并将其设置为当前值,并将教程中的内容附加到末尾。但是SUCCESS: Specified value was saved.
,当我输入时:
C:\>PATH
它返回的是原来的内容(我尝试附加的内容不存在)。我尝试了另一种方法。我运行了
C:\>PATH=%PATH%;%STORM_HOME%\bin;%JAVA_HOME%\bin;C:\Python27;C:\Python27\Lib\site-packages\;C:\Python27\Scripts\;
然后,当我输入时,C:\>PATH
它返回了完整的路径,其中包含我想要附加的内容。
我现在面临的问题是使用这些变量。当我输入
C:\>cd %STORM_HOME%
它说The system cannot find the path specified.
我尝试重新启动计算机但PATH
重置后仍然出现相同的错误。
答案1
@DavidPostill 是正确的,但实际上并没有解决您的问题。实际答案要简单得多:命令提示符与任何程序一样,在启动时接收其环境变量。当您设置持久环境变量(每个用户或系统范围)时,您正在更改确定未来进程的环境变量的注册表值。你实际上并没有改变任何环境变量当前的过程!
来自 SETX 帮助文档(setx /?
):
2) On a local system, variables created or modified by this tool will be available in future command windows but not in the current CMD.exe command window.
有两种方法可以解决这个问题。最简单的方法是,如文档所示,启动一个新的 CMD 实例。这很容易,但这样你就没有命令历史记录了,等等。更复杂的方法是设置本地环境变量(使用命令set
)。最好的方法是set
先使用,然后setx
使用当前环境变量调用。下面是一个例子,来自你上面所做的:
REM Set the local version of JAVA_HOME
set JAVA_HOME=C:\JAVA\jdk1.8.0_60\
REM Set the local version of STORM_HOME
set STORM_HOME=C:\storm-0.9.1-incubating-SNAPSHOT-12182013\
REM Append the new values to PATH
set PATH=%PATH%;%STORM_HOME%\bin;%JAVA_HOME%\bin;C:\Python27;C:\Python27\Lib\site-packages\;C:\Python27\Scripts\;
REM Do whatever checks you want to do to confirm that those are set correctly
cd %STORM_HOME%
REM Now, save the current (local) values of the environment variables
REM to persistent storage (registry)
setx JAVA_HOME %JAVA_HOME%
setx STORM_HOME %STORM_HOME%
setx PATH %PATH%
请注意字符的使用%
。它们是在扩展环境变量时使用的,而不是在引用环境变量时使用的。setx
上面的行被处理为“将用户范围的环境变量 JAVA_HOME 设置为此进程的当前本地值 JAVA_HOME”,这相当于说“将持久环境变量 JAVA_HOME 设置为C:\JAVA\jdk1.8.0_60\
”,因为这是 %JAVA_HOME% 在当前进程中扩展为的值。
答案2
为什么 SETX 没有更新我的 PATH
setx PATH C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;%STORM_HOME%\bin;%JAVA_HOME%\bin;C:\Python27;C:\Python27\Lib\site-packages\;C:\Python27\Scripts\;
你的setx
语法是错误的:
"
将第二个参数(“值”)放在引号内。如果第二个参数包含空格,则应该用引号引起来,并且
%PATH%
几乎总是包含空格。
您应该使用:
setx PATH "%PATH%;%STORM_HOME%\bin;%JAVA_HOME%\bin"
或者:
setx PATH "%STORM_HOME%\bin;%JAVA_HOME%\bin;%PATH%"
句法
SETX [/s Computer [Credentials]] Variable Value [/m] SETX [/s Computer [Credentials]] [Variable] /k RegistryPath [/m] SETX [/s Computer [Credentials]] /f FileName {[Variable] {/a L,T | /r oL,oT "SearchString"} [/m] | /x} [/d Delimiters]
来源设置
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 设置- 永久设置环境变量,SETX 可用于为机器(HKLM)或当前登录用户(HKCU)设置环境变量。