使用 Program Files (x86) 处理文件路径时批处理文件中出现奇怪错误
Strange error in batch file when handling a file path with Program Files (x86)
我正在编写批处理脚本以从 JAVA_HOME 环境变量中删除引号,并且仅当 JAVA_HOME 在路径中设置为 "Program Files (x86)" 时才会出现错误。我的 JAVA_HOME 变量设置为 C:\Program Files (x86)\Java\jdk1.7.0_79
(值中没有引号)
set lastChar=%JAVA_HOME:~-1%
set firstChar=%JAVA_HOME:~0,1%
echo Begin
if '^%firstChar%=='^" (
echo JAVA_HOME starts with a quote
if '^%lastChar%=='^" (
echo JAVA_HOME ends with a quote
set JAVA_HOME=%JAVA_HOME:~1,-1% ###Error occurs on this line
)
)
echo END
输出为:
Begin
\Java\jdk1.7.0_7 was unexpected at this time.
如您所见,"echo Begin" 之后的 none 行是 运行。如果我注释掉 set JAVA_HOME=%JAVA_HOME:~1,-1%
行,那么程序 运行 就会一直结束。此外,如果我将 JAVA_HOME env var 更改为 C:\Program Files\Java\jdk1.7.0_79
,则脚本 运行 可以正常运行,无需注释掉该行。
为什么这一行给我这个错误?
^
转义其他字符。所以 ^%
意味着 CMD 没有百分号。使用 ^^%firstchar%==^^
转义插入符号,这样它就不会转义 %
和 "
.
处理环境变量中有问题的字符的最简单方法是使用延迟扩展。您可以进行字符串替换以删除任何引号。我假设您希望修改后的值在批处理脚本结束后保留,因此我使用 FOR 变量将修改后的值传输到 ENDLOCAL 屏障。
@echo off
setlocal enableDelayedExpansion
set "val=!JAVA_HOME:"=!"
for /f "delims=" %%A in ("!val!") do endlocal&set "JAVA_HOME=%%A"
可以从命令行执行此操作,而无需使用批处理。但是要获得正确的转义序列有点棘手
for /f "delims=" %A in ('cmd /v:on /c echo !JAVA_HOME:^"^=!') do @set "JAVA_HOME=%A"
我正在编写批处理脚本以从 JAVA_HOME 环境变量中删除引号,并且仅当 JAVA_HOME 在路径中设置为 "Program Files (x86)" 时才会出现错误。我的 JAVA_HOME 变量设置为 C:\Program Files (x86)\Java\jdk1.7.0_79
(值中没有引号)
set lastChar=%JAVA_HOME:~-1%
set firstChar=%JAVA_HOME:~0,1%
echo Begin
if '^%firstChar%=='^" (
echo JAVA_HOME starts with a quote
if '^%lastChar%=='^" (
echo JAVA_HOME ends with a quote
set JAVA_HOME=%JAVA_HOME:~1,-1% ###Error occurs on this line
)
)
echo END
输出为:
Begin
\Java\jdk1.7.0_7 was unexpected at this time.
如您所见,"echo Begin" 之后的 none 行是 运行。如果我注释掉 set JAVA_HOME=%JAVA_HOME:~1,-1%
行,那么程序 运行 就会一直结束。此外,如果我将 JAVA_HOME env var 更改为 C:\Program Files\Java\jdk1.7.0_79
,则脚本 运行 可以正常运行,无需注释掉该行。
为什么这一行给我这个错误?
^
转义其他字符。所以 ^%
意味着 CMD 没有百分号。使用 ^^%firstchar%==^^
转义插入符号,这样它就不会转义 %
和 "
.
处理环境变量中有问题的字符的最简单方法是使用延迟扩展。您可以进行字符串替换以删除任何引号。我假设您希望修改后的值在批处理脚本结束后保留,因此我使用 FOR 变量将修改后的值传输到 ENDLOCAL 屏障。
@echo off
setlocal enableDelayedExpansion
set "val=!JAVA_HOME:"=!"
for /f "delims=" %%A in ("!val!") do endlocal&set "JAVA_HOME=%%A"
可以从命令行执行此操作,而无需使用批处理。但是要获得正确的转义序列有点棘手
for /f "delims=" %A in ('cmd /v:on /c echo !JAVA_HOME:^"^=!') do @set "JAVA_HOME=%A"