Windows 7 vs Windows 10 - 处理批处理文件中带空格的文件夹名称

Windows 7 vs Windows 10 - Handling folder names with spaces in batch files

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

特别是,在 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_bin_Path包含一个文件夹,里面有空格;它引用的完整路径是:

C:\Users\Rafael\AppData\Roaming\GNU MCU Eclipse\OpenOCD[=13=].10.0-7-20180123-1217\bin

但是,在 Windows 10 上,同一行失败并显示以下错误:

'C:\Users\Rafael\AppData\Roaming\GNU' is not recognized as an internal or external command, operable program or batch file.

如果我将命令更改为:

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' is not recognized as an internal or external command, operable program or batch file.

注意这个版本前面的额外 ""

TLDR;有没有一种方法可以让我在两个系统上工作,而无需使用开关来检测哪个 OS 是 运行nning?

cmd.exe 是愚蠢的,它从命令中删除了开始和结束引号,但有一个 hack 可以打败它:

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_bin_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 Off
Set "OpenOCD_bin_Path=%AppData%\GNU MCU Eclipse\OpenOCD[=10=].10.0-7-20180123-1217\bin"
CD /D "%OpenOCD_bin_Path%\..\scripts" 2>Nul || Exit / B
Start "" Cmd /K "..\bin\openocd.exe -f interface\ftdi\SuperDongle.cfg -f target\nrf52.cfg"

或者您可以在不显式启动的情况下尝试 cmd.exe:

@Echo Off
Set "OpenOCD_bin_Path=%AppData%\GNU MCU Eclipse\OpenOCD[=11=].10.0-7-20180123-1217\bin"
CD /D "%OpenOCD_bin_Path%\..\scripts" 2>Nul || Exit / B
Start ..\bin\openocd.exe -f interface\ftdi\SuperDongle.cfg -f target\nrf52.cfg

使用Start /D:

@Echo Off
Set "OpenOCD_bin_Path=%AppData%\GNU MCU Eclipse\OpenOCD[=12=].10.0-7-20180123-1217\bin"
Start "" /D "%OpenOCD_bin_Path%" Cmd /K "openocd.exe -f ..\scripts\interface\ftdi\SuperDongle.cfg -f ..\scripts\target\nrf52.cfg"

或者再次没有明确开始cmd.exe:

@Echo Off
Set "OpenOCD_bin_Path=%AppData%\GNU MCU Eclipse\OpenOCD[=13=].10.0-7-20180123-1217\bin"
Start "" /D "%OpenOCD_bin_Path%" openocd.exe -f ..\scripts\interface\ftdi\SuperDongle.cfg -f ..\scripts\target\nrf52.cfg