Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Win10批处理脚本:\Notepad++;在这个时候是出人意料的_Windows_Batch File - Fatal编程技术网

Windows Win10批处理脚本:\Notepad++;在这个时候是出人意料的

Windows Win10批处理脚本:\Notepad++;在这个时候是出人意料的,windows,batch-file,Windows,Batch File,此批处理文件在标题中显示错误: if "%PROCESSOR_ARCHITECTURE%"=="x86" ( echo FOOBAR ) else ( set HOME_EDIT=%SystemDrive%\Program Files (x86)\Notepad++ ) 这是在Win10 Pro x64系统上进行的(因此测试为假) 奇怪的是,“set HOME_EDIT…”行如果自己执行,就不会生成错误。几周前,这个批处理文件似乎还可以正常工作(我知道这本书中最古老的投诉,但可

此批处理文件在标题中显示错误:

if "%PROCESSOR_ARCHITECTURE%"=="x86" (
    echo FOOBAR
) else (
    set HOME_EDIT=%SystemDrive%\Program Files (x86)\Notepad++
)
这是在Win10 Pro x64系统上进行的(因此测试为假)

奇怪的是,“set HOME_EDIT…”行如果自己执行,就不会生成错误。几周前,这个批处理文件似乎还可以正常工作(我知道这本书中最古老的投诉,但可能是最近Win10创建者的更新出了什么问题?)

以下是全部输出:

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>

回答我自己的问题:

@drescherjm(在评论中)正确地指出,当前的问题是在要设置的参数周围缺少引号(“foo”)。不知何故,当集合位于IF语句中时,这一点很重要,即使它不在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”的行):


在输入IF语句之前,将包含空格的路径设置为默认值。这样就不需要引号,SETX以后也不会中断。

回答我自己的问题:

@drescherjm(在评论中)正确地指出,当前的问题是在要设置的参数周围缺少引号(“foo”)。不知何故,当集合位于IF语句中时,这一点很重要,即使它不在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”的行):


在输入IF语句之前,将包含空格的路径设置为默认值。这样就不需要引号,SETX以后也不会中断。

在赋值周围加引号当然可以解决问题,但与空格无关。问题是路径中的
正在过早关闭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++"
)

在作业周围加引号当然可以解决问题,但与空格无关。问题是路径中的
正在过早关闭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++"
)

您需要使用引号,因为路径中有空格。@drescherjm您似乎是对的,因为它与引号一起工作。但是,如果集合本身在一条线上,则它在没有引号的情况下工作。我讨厌批处理文件。回答这个问题,我会向上投票。
set HOME\u EDIT=“%ProgramFiles(x86)%\Notepad++”
由于路径中有空格,您需要使用引号。@drescherjm您似乎是对的,因为它可以使用引号。但是,如果集合本身在一条线上,则它在没有引号的情况下工作。我讨厌批处理文件。回答这个问题,我会投票表决。
set HOME\u EDIT=“%ProgramFiles(x86)%\Notepad++”
您似乎在强制Notepad++的路径指向64位系统上32位可执行文件的位置,这真的是您想要的吗?64位操作系统从程序文件运行64位可执行文件;32位操作系统从程序文件运行32位可执行文件;64位操作系统从程序文件(x86)运行32位可执行文件。@Compo是的,这就是目的。我在x86和x64两台机器上都运行32位记事本+。强制这样做似乎有点奇怪。另外,您是否知道,
%PROCESSOR\u ARCHITECTURE%
仅返回
x86
并不意味着您没有运行64位操作系统?(您可能也在某些64位系统上强制使用32位版本的cygwin!)您似乎在强制将Notepad++的路径指向64位系统上32位可执行文件的位置,这真的是您想要的吗?64位操作系统从程序文件运行64位可执行文件;32位操作系统从程序文件运行32位可执行文件;64位操作系统从程序文件(x86)运行32位可执行文件。@Compo是的,这就是目的。我在x86和x64两台机器上都运行32位记事本+。强制这样做似乎有点奇怪。另外,您是否知道,
%PROCESSOR\u ARCHITECTURE%
仅返回
x86
并不意味着您没有运行64位操作系统?(您可能也在一些64位系统上强制使用32位版本的cygwin!)