首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用CMDER,设置路径

使用CMDER,设置路径
EN

Stack Overflow用户
提问于 2019-04-18 21:44:21
回答 2查看 4.8K关注 0票数 0

我正在尝试在我设置的开发环境中使用CMDER

基本上,我创建了一个.bat文件,该文件调用:

代码语言:javascript
运行
复制
@ECHO OFF 
start Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\CMDER\Cmder.exe

然后我将文件startdev.bat放在:%CMDER_HOME%\config\profile.d中

所以一切看起来都很好,但是当startdev.bat完成时,发出一个:

代码语言:javascript
运行
复制
echo %PATH%

返回:

代码语言:javascript
运行
复制
Z:\_DEV\OS_WINDOWS\1_COMPILER\JDK\ORACLE\1.8.0_181\bin;Z:\_DEV\OS_CYGWIN\bin;Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\CLutils;Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\PUTTY;Z:\_DEV\OS_WINDOWS\6_VERSION_CONTROL\PortableGit\bin;C:\WINDOWS;C:\WINDOWS\SysWOW64;C:\WINDOWS\System32

...any知道发生了什么事吗?

我希望CMDER使用来自其自身设置的值覆盖路径,或者使用my,在startdev.bat结束之前,该路径显示以下值:

代码语言:javascript
运行
复制
PATH=Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\CMDER\vendor\conemu-maximus5;Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\CMDER\vendor\conemu-maximus5\ConEmu;Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\CMDER\vendor\conemu-maximus5\ConEmu\Scripts;Z:\_DEV\OS_ALL\JVM\3_BUILD_TOOLS\GRADLE\5.4\bin;Z:\_DEV\OS_ALL\JVM\3_BUILD_TOOLS\MAVEN\3.5.4\bin;Z:\_DEV\OS_ALL\JVM\3_BUILD_TOOLS\ANT\1.10.5\bin;Z:\_DEV\OS_WINDOWS\3_BUILD_TOOLS\NODE\LTS\10.15.3;Z:\_DEV\OS_WINDOWS\3_BUILD_TOOLS\NODE\LTS\10.15.3\node_modules;Z:\_DEV\OS_WINDOWS\1_COMPILER\GO\1.12.4\bin;Z:\_DEV\OS_WINDOWS\1_COMPILER\PYTHON\32bit\2.7.13;Z:\_DEV\OS_WINDOWS\1_COMPILER\PYTHON\32bit\2.7.13\scripts;Z:\_DEV\OS_WINDOWS\1_COMPILER\ANDROID\android-sdk-windows\platform-tools;Z:\_DEV\OS_WINDOWS\1_COMPILER\JDK\ORACLE\1.8.0_181\bin;Z:\_DEV\OS_CYGWIN\bin;Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\CLutils;Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\PUTTY;Z:\_DEV\OS_WINDOWS\6_VERSION_CONTROL\PortableGit\bin;C:\WINDOWS;C:\WINDOWS\SysWOW64;C:\WINDOWS\System32

..but --它似乎只保留了在批处理作业过程中定义的值,这是很奇怪的。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-19 05:40:11

首先,我建议打开命令提示符窗口,并运行setlocal /?endlocal /?,以便显示这两个命令的帮助/文档。非常重要的是,每个没有相应endlocalendlocal都会在退出批处理文件或命令CALL调用的子程序之前,由cmd.exe隐式执行endlocal

接下来,我建议阅读这个答案,以获得更多关于命令、SETLOCAL、ENDLOCAL以及使用它们时发生的事情的详细信息。

我建议像希思一样修改这个代码块:

代码语言:javascript
运行
复制
setLocal EnableDelayedExpansion
set CLASSPATH=.
for /R %JRE_HOME%\lib %%a in (*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!

最好是:

代码语言:javascript
运行
复制
setLocal EnableExtensions EnableDelayedExpansion
set CLASSPATH=.
for /R "%JRE_HOME%\lib" %%a in (*.jar) do set "CLASSPATH=!CLASSPATH!;%%a"
endlocal & set "CLASSPATH=%CLASSPATH%"

现在,本地环境的结束是将环境变量CLASSPATH从其定义的本地环境传递到还原的前一个环境中,因为cmd.exe在执行还原前环境的命令endlocal之前,将%CLASSPATH%扩展为当前本地环境中环境变量CLASSPATH的当前值。

批处理文件中的错误也是set WINDIR=%SystemRoot%;%SystemRoot%,它应该是set "WINDIR=%SystemRoot%"

我建议进一步阅读为什么在命令行上使用'set var = text‘之后没有带有'echo %var%’的字符串输出?,它解释了为什么现在推荐语法set "variable=string value"。许多环境变量定义直接或间接地使用%UserProfile%,这意味着取决于当前运行批处理文件的用户在创建用户帐户时输入的用户名。我见过用户输入包含空格和非ASCII字符的名称。我还看到用户创建了一个用户名包含字符& (如Company GmbH & Co )的帐户。双引号字符串外的符号和符号被解释为操作符,cmd.exe试图在set之后执行,而在使用set USERHOME=%DEVHOME%\%USERNAME%而不是set "USERHOME=%DEVHOME%\%USERNAME%"的命令行时,也尝试在&之后执行其余的字符串。嗯,startdev.bat重新定义了几乎所有预定义的Windows环境变量,包括USERNAMEUSERPROFILE,因此对于大多数环境变量定义来说都是安全的。

这个代码块也不是最优的:

代码语言:javascript
运行
复制
FOR /F "usebackq" %%i IN (`hostname`) DO SET HOSTNAME=%%i
echo Running on hostname: %HOSTNAME%

主机名(分别为计算机名)也可能包含命令行所需的一个或多个字符,或以分号开头的字符,原因不明。更好的办法是:

代码语言:javascript
运行
复制
FOR /F delims^=^ eol^= %%i IN ('hostname') DO SET "HOSTNAME=%%i"
setlocal EnableDelayedExpansion & echo Running on host name: !HOSTNAME!& endlocal

因此,有了由Windows预定义的环境变量COMPUTERNAME,就可以只使用以下命令行:

代码语言:javascript
运行
复制
setlocal EnableDelayedExpansion & echo Running on host name: !ComputerName!& endlocal

包含立即展开的环境变量引用的回波命令行,如果它的值包含&|<>,则未知,因为环境变量引用在cmd.exe进一步处理命令行之前被展开,如Windows解释器(CMD.EXE)如何解析脚本?所述。

我还建议阅读DosTips论坛主题回音。未能给出文本或空行,而使用ECHO/,避免在批处理文件中使用echo.输出空行。

票数 1
EN

Stack Overflow用户

发布于 2019-04-19 02:19:09

“半程批处理作业”,因为您有一个setLocal EnableDelayedExpansion,它将变量PATH或其他集变量设置为本地变量的任何进一步更改。未指定的endLocal隐含在脚本的末尾。

要解决这个问题,请在同一条解析行上使用endLocalset CLASSPATH=%CLASSPATH%CLASSPATH设置为全局。

更改本部分:

代码语言:javascript
运行
复制
    setLocal EnableDelayedExpansion
    set CLASSPATH=.
    for /R %JRE_HOME%\lib %%a in (*.jar) do (
        set CLASSPATH=!CLASSPATH!;%%a
    )
    set CLASSPATH=!CLASSPATH!

对此:

代码语言:javascript
运行
复制
    setLocal EnableDelayedExpansion
    set CLASSPATH=.
    for /R %JRE_HOME%\lib %%a in (*.jar) do (
        set CLASSPATH=!CLASSPATH!;%%a
    )
    endLocal & set CLASSPATH=%CLASSPATH%

在更改部分之后,脚本将再次将set变量作为全局变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55754089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档