此批处理文件在标题中显示错误:
if "%PROCESSOR_ARCHITECTURE%"=="x86" (
echo FOOBAR
) else (
set HOME_EDIT=%SystemDrive%\Program Files (x86)\Notepad++
)
这是在Win10 Pro x64系统上(因此测试结果为假)。
奇怪的是"设置HOME_EDIT ......" line,如果自己执行,则不会生成错误。几周前这个批处理文件似乎运行正常(书中最老的抱怨,我知道,但也许最近的Win10 Creator&Update更新了什么?)。
这是整个输出:
U:\Users\Dave\data\PC setup\2017-03 PC Setup for Win10>test.bat
\Notepad++ was unexpected at this time.
U:\Users\Dave\data\PC setup\2017-03 PC Setup for Win10> set HOME_EDIT=C:\Program Files (x86)\Notepad++
U:\Users\Dave\data\PC setup\2017-03 PC Setup for Win10>
答案 0 :(得分:2)
在作业周围加上引号肯定能解决问题,但它与空格无关。问题是路径中的)
过早地关闭ELSE块,除非引用(或转义)路径。
没有引号,ELSE块变为
) else (
set HOME_EDIT=%SystemDrive%\Program Files (x86
)
然后\Notepad++
确实意外,导致语法错误。
我看到3种消除语法错误的方法:
1)消除括号并将SET命令放在与ELSE相同的行上
else set HOME_EDIT=%SystemDrive%\Program Files (x86)\Notepad++
2)在作业周围加上引号
) else (
set "HOME_EDIT=%SystemDrive%\Program Files (x86)\Notepad++"
)
3)退出右括号
) else (
set HOME_EDIT=%SystemDrive%\Program Files (x86^)\Notepad++
)
如果我要进行分配,我会使用预定义的环境变量作为文件夹。
) else (
set "HOME_EDIT=%ProgramFiles(x86)%\Notepad++"
)
答案 1 :(得分:0)
回答我自己的问题:
@drescherjm是正确的(在评论中),直接问题是在SET的参数周围缺少引号(“foo”)。不知何故,当SET在IF语句中时,这很重要,即使它不存在。
但是在我的批处理脚本中添加引号只是打破了别的东西:
set NEW_PATH=%HOME_WINDOWS%
set NEW_PATH=%NEW_PATH%;%BinPath%
set NEW_PATH=%NEW_PATH%;%BinPath%\ffmpeg\bin
set NEW_PATH=%NEW_PATH%;%BinPath%\mplayer
set NEW_PATH=%NEW_PATH%;%BinPath%\gui
set NEW_PATH=%NEW_PATH%;%BinPath%\dll
set NEW_PATH=%NEW_PATH%;%HOME_CYGWIN%\bin
set NEW_PATH=%NEW_PATH%;%HOME_CYGWIN%\sbin
set NEW_PATH=%NEW_PATH%;%HOME_CYGWIN%\usr\bin
set NEW_PATH=%NEW_PATH%;%HOME_CYGWIN%\usr\sbin
set NEW_PATH=%NEW_PATH%;%HOME_7ZIP%
set NEW_PATH=%NEW_PATH%;%HOME_EDIT%
set NEW_PATH=%NEW_PATH%;%HOME_DIFF%
set Path=%NEW_PATH%
setx Path "%NEW_PATH%"
如果HOME_EDIT中包含引号,则会导致SETX失败。
这是我提出的修复方法(注意标有“TRICK1”的行):
REM The following is a trick to get around spaces in the path (TRICK1)
set HOME_EDIT=%SystemDrive%\%ProgramFiles(x86)%\Notepad++
if "%PROCESSOR_ARCHITECTURE%"=="x86" (
set HOME_CYGWIN=%SystemDrive%\cygwin
set HOME_EDIT=%SystemDrive%\Program Files\Notepad++
) else (
set HOME_CYGWIN=%SystemDrive%\cygwin64
REM (TRICK1 rem this out) set HOME_EDIT=%SystemDrive%\%ProgramFiles(x86)%\Notepad++
)
在输入IF语句之前,带有空格的路径是SET作为默认值。这样就不需要引号,SETX也不会破坏。