Windows 7与Windows 10-在批处理文件中使用空格处理文件夹名称

Windows 7与Windows 10-在批处理文件中使用空格处理文件夹名称,windows,batch-file,windows-7,escaping,windows-10,Windows,Batch File,Windows 7,Escaping,Windows 10,我正在尝试创建一个批处理脚本,该脚本必须同时在Windows7和Windows10上运行。但是,每个文件夹处理带有空格的文件夹名称的方式似乎有所不同,我必须以不同的方式转义它们 特别是,在Windows 7上,我成功地使用了以下命令: start cmd.exe /k "%OpenOCD_bin_Path%\openocd.exe -f %OpenOCD_bin_Path%\..\scripts\interface\ftdi\SuperDongle.cfg -f %OpenOCD_bin_Pat

我正在尝试创建一个批处理脚本,该脚本必须同时在
Windows7
Windows10
上运行。但是,每个文件夹处理带有空格的文件夹名称的方式似乎有所不同,我必须以不同的方式转义它们

特别是,在Windows 7上,我成功地使用了以下命令:

start cmd.exe /k "%OpenOCD_bin_Path%\openocd.exe -f %OpenOCD_bin_Path%\..\scripts\interface\ftdi\SuperDongle.cfg -f %OpenOCD_bin_Path%\..\scripts\target\nrf52.cfg"
OpenOCD\u bin\u路径
包含一个文件夹,其中包含空格;它引用的完整路径是:

C:\Users\Rafael\AppData\Roaming\GNU MCU Eclipse\OpenOCD\0.10.0-7-20180123-1217\bin
但是,在Windows 10上,同一行出现故障并显示以下错误:

“C:\Users\Rafael\AppData\Roaming\GNU”不能识别为内部或外部命令、可操作程序或批处理文件

如果我将命令更改为:

start cmd.exe /k ""%OpenOCD_bin_Path%"\openocd.exe -f "%OpenOCD_bin_Path%"\..\scripts\interface\ftdi\SuperDongle.cfg -f "%OpenOCD_bin_Path%"\..\scripts\target\nrf52.cfg"
它成功了

相反,如果在Windows 7上运行该命令,则会出现以下错误:

“C:\Users\Rafael\AppData\Roaming\GNU”未被识别为内部或外部命令、可操作程序或批处理文件

请注意此版本前面额外的


TLDR;有没有一种方法可以使这两个系统都能运行,而不必使用开关来检测哪个操作系统正在运行?

cmd.exe很愚蠢,它会从命令中删除起始和结束引号,但有一种方法可以阻止它:

start cmd.exe /k if 1==1 "%OpenOCD_bin_Path%\openocd.exe" -f "%OpenOCD_bin_Path%\..\scripts\interface\ftdi\SuperDongle.cfg" -f "%OpenOCD_bin_Path%\..\scripts\target\nrf52.cfg"
无论怎样,从
start
调用cmd.exe都是毫无意义的,只需使用
start

start "" "%OpenOCD_bin_Path%\openocd.exe" -f "%OpenOCD_bin_Path%\..\scripts\interface\ftdi\SuperDongle.cfg" -f "%OpenOCD_bin_Path%\..\scripts\target\nrf52.cfg"
重要的是,
%OpenOCD\u bin\u Path%
在所有系统上的引号是相同的。通常不引用环境中设置的路径,因为在需要时很难再次删除引号

您可以去掉引号,但理想情况下,由于转义问题,应该避免在批处理文件中处理字符串操作

下面是一个尝试处理这两种情况的示例:

@echo off
goto run_tests

:stripquotes
FOR /F "tokens=1,*" %%A IN ('echo.%*') DO set %%~A=%%~B
goto :EOF

:test
call :stripquotes mynewvar %*
echo DEBUG: mynewvar is now %mynewvar%
start "" "%mynewvar%\app.exe" "par am 1" param2 "par am 3"
goto :EOF


:run_tests
set OpenOCD_bin_Path=c:\foo bar\baz
call :test %OpenOCD_bin_Path%

set OpenOCD_bin_Path="c:\foo bar\baz"
call :test %OpenOCD_bin_Path%

使用我在评论中提供的任何一个想法都应该绕过空格

使用
CD/D

@Echo关闭
设置“OpenOCD\u bin\u路径=%AppData%\GNU MCU Eclipse\OpenOCD\0.10.0-7-20180123-1217\bin”
CD/D“%OpenOCD\u bin\u Path%\..\scripts”2>num退出/B
启动“Cmd/K”。\bin\openocd.exe-f interface\ftdi\SuperDongle.cfg-f target\nrf52.cfg
或者,您可以在不显式启动
cmd.exe的情况下进行尝试:

@Echo关闭
设置“OpenOCD\u bin\u路径=%AppData%\GNU MCU Eclipse\OpenOCD\0.10.0-7-20180123-1217\bin”
CD/D“%OpenOCD\u bin\u Path%\..\scripts”2>num退出/B
开始..\bin\openocd.exe-f interface\ftdi\SuperDongle.cfg-f target\nrf52.cfg
使用
启动/D

@Echo关闭
设置“OpenOCD\u bin\u路径=%AppData%\GNU MCU Eclipse\OpenOCD\0.10.0-7-20180123-1217\bin”
启动“/D”%OpenOCD\u bin\u Path%”Cmd/K“OpenOCD.exe-f..\scripts\interface\ftdi\SuperDongle.cfg-f..\scripts\target\nrf52.cfg”
或者再次不显式启动
cmd.exe

@Echo关闭
设置“OpenOCD\u bin\u路径=%AppData%\GNU MCU Eclipse\OpenOCD\0.10.0-7-20180123-1217\bin”
启动“/D”%OpenOCD\u bin\u Path%”OpenOCD.exe-f..\scripts\interface\ftdi\SuperDongle.cfg-f..\scripts\target\nrf52.cfg

如果使用
Start
/D
选项会发生什么?或者可以先使用
CD/D
将当前工作目录设置为最深的公共父目录,然后使用
\openocd.exe-f interface\ftdi\SuperDongle.cfg-f target\nrf52.cfg
。顺便说一句,
C:\Users\Rafael\AppData\Roaming
可以替换为
%AppData%
。如果我做第一个,它在Windows 10中工作,但在Windows 7中不工作(与最初的错误相同),第二个根本不工作。它会创建一个弹出窗口,上面写着“检查命令并重试”之类的内容,然后打印整个(但正确地取消引用)命令……您确定%OpenOCD_bin_Path%在两个系统上都是相同的吗?有趣的是,它不一样。在Windows7上,它有双引号,但在Windows10上没有。通过“echo”访问。我将在周一详细讨论,但据我所知,它们是使用完全相同的命令“setx-m”创建的,该命令以前是从另一个批处理文件运行的。它不应该有引号。带引号的不完整路径很难使用。我将用删除报价的版本更新我的代码…我能够修改您的报价处理脚本。到目前为止,它在两个平台上都能工作…一旦我进行了更全面的测试,很快就会更新。好的,前两个在Windows 7和10上都能工作,后两个只在Windows 10上工作。刚刚测试了全部内容,没有一个能在我的应用程序中正常工作。这是因为存在于原始目录中的脚本引用了更多的文件。如果我使用CD调用该命令或在%OpenOCD_bin_Path%中启动该命令,则它是另一个环境,因此找不到这些文件。在我完全从调用目录启动命令的版本中,它确实可以工作,因此除非我更改脚本的其余部分(这会引发更多问题),否则我实际上需要在实际命令中正确地取消对路径的引用。