我正在尝试在我设置的开发环境中使用CMDER。
基本上,我创建了一个.bat文件,该文件调用:
@ECHO OFF
start Z:\_DEV\OS_WINDOWS\9_MISC_TOOLS\CMDER\Cmder.exe然后我将文件startdev.bat放在:%CMDER_HOME%\config\profile.d中
所以一切看起来都很好,但是当startdev.bat完成时,发出一个:
echo %PATH%返回:
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结束之前,该路径显示以下值:
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 --它似乎只保留了在批处理作业过程中定义的值,这是很奇怪的。
有什么想法吗?
发布于 2019-04-19 05:40:11
首先,我建议打开命令提示符窗口,并运行setlocal /?和endlocal /?,以便显示这两个命令的帮助/文档。非常重要的是,每个没有相应endlocal的endlocal都会在退出批处理文件或命令CALL调用的子程序之前,由cmd.exe隐式执行endlocal。
接下来,我建议阅读这个答案,以获得更多关于命令、SETLOCAL、和ENDLOCAL以及使用它们时发生的事情的详细信息。
我建议像希思一样修改这个代码块:
setLocal EnableDelayedExpansion
set CLASSPATH=.
for /R %JRE_HOME%\lib %%a in (*.jar) do (
set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!最好是:
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环境变量,包括USERNAME和USERPROFILE,因此对于大多数环境变量定义来说都是安全的。
这个代码块也不是最优的:
FOR /F "usebackq" %%i IN (`hostname`) DO SET HOSTNAME=%%i
echo Running on hostname: %HOSTNAME%主机名(分别为计算机名)也可能包含命令行所需的一个或多个字符,或以分号开头的字符,原因不明。更好的办法是:
FOR /F delims^=^ eol^= %%i IN ('hostname') DO SET "HOSTNAME=%%i"
setlocal EnableDelayedExpansion & echo Running on host name: !HOSTNAME!& endlocal因此,有了由Windows预定义的环境变量COMPUTERNAME,就可以只使用以下命令行:
setlocal EnableDelayedExpansion & echo Running on host name: !ComputerName!& endlocal包含立即展开的环境变量引用的回波命令行,如果它的值包含&|<>,则未知,因为环境变量引用在cmd.exe进一步处理命令行之前被展开,如Windows解释器(CMD.EXE)如何解析脚本?所述。
我还建议阅读DosTips论坛主题回音。未能给出文本或空行,而使用ECHO/,避免在批处理文件中使用echo.输出空行。
发布于 2019-04-19 02:19:09
“半程批处理作业”,因为您有一个setLocal EnableDelayedExpansion,它将变量PATH或其他集变量设置为本地变量的任何进一步更改。未指定的endLocal隐含在脚本的末尾。
要解决这个问题,请在同一条解析行上使用endLocal和set CLASSPATH=%CLASSPATH%将CLASSPATH设置为全局。
更改本部分:
setLocal EnableDelayedExpansion
set CLASSPATH=.
for /R %JRE_HOME%\lib %%a in (*.jar) do (
set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!对此:
setLocal EnableDelayedExpansion
set CLASSPATH=.
for /R %JRE_HOME%\lib %%a in (*.jar) do (
set CLASSPATH=!CLASSPATH!;%%a
)
endLocal & set CLASSPATH=%CLASSPATH%在更改部分之后,脚本将再次将set变量作为全局变量。
https://stackoverflow.com/questions/55754089
复制相似问题