2017-04-17 92 views
0

此批处理文件给出了标题错误:Win10批处理脚本:记事本+ +是意外在这个时候

if "%PROCESSOR_ARCHITECTURE%"=="x86" (
    echo FOOBAR 
) else (
    set HOME_EDIT=%SystemDrive%\Program Files (x86)\Notepad++ 
) 

这是一个Win10 Pro的x64系统上(所以测试是假的)。

奇怪的是,“设置HOME_EDIT ...”行,如果自行执行,不会产生错误。而且这个批处理文件几周前似乎可以正常工作(本书中最古老的投诉,我知道,但是最近的Win10 Creator更新引起了一些争议?)。

这里的整个输出:

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

由于路径中有空格,所以需要使用引号。 – drescherjm

+0

@drescherjm看起来你是对的,因为它适用于引号。但是,如果SET本身就在一行上,它将不带引号。Grrr我讨厌批处理文件。让它成为一个答案,我会upvote它。 –

+0

'Set HOME_EDIT =“%ProgramFiles(x86)%\ Notepad ++”' – Compo

回答

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++" 
) 
0

回答我的问题:

@drescherjm是正确的(在评论),眼下的问题是缺乏引号的(“富”)周围的参数SET。不知何故,当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语句之前的默认值空间的路径。这种方式不需要引号,并且SETX不会稍后中断。

+1

您似乎在将Notepad ++的路径强制为64位系统上32位可执行文件的位置,这真的是您想要的吗? 64位操作系统运行Program Files的64位可执行文件; 32位操作系统运行Program Files的32位可执行文件; 64位操作系统运行Program Files(x86)的32位可执行文件。 – Compo

+0

@Compo是的,这是意图。我在x86和x64机器上运行32位Notepad ++。 –

+0

强迫这样的事情似乎有点奇怪。你也知道'%PROCESSOR_ARCHITECTURE%'简单地返回'x86'并不意味着你没有运行64位操作系统? _(你可能会迫使在一些64位系统上使用一个32位版本的cygwin!)_ – Compo