我正在编写一个批处理脚本来删除JAVA_HOME env变量中的引号,并且仅当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"之后没有一行。跑了。如果我注释掉行set JAVA_HOME=%JAVA_HOME:~1,-1%
,那么程序一直运行到END。此外,如果我将JAVA_HOME env var更改为C:\Program Files\Java\jdk1.7.0_79
,则脚本运行正常而不会注释掉该行。
为什么这一行给我这个错误?
答案 0 :(得分:1)
处理环境变量中有问题的字符的最简单方法是使用延迟扩展。您可以执行字符串替换以删除任何引号。我假设您希望修改后的值在批处理脚本结束后保持不变,因此我使用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"
答案 1 :(得分:0)
DateTime::CreateFromFormat
逃避其他角色。所以^
表示没有百分号签到CMD。使用^%
来转义插入符,以便它不会转义^^%firstchar%==^^
和%
。