Windows 7 vs Windows 10 - 处理批处理文件中带空格的文件夹名称
Windows 7 vs Windows 10 - Handling folder names with spaces in batch files
我正在尝试创建一个必须在 Windows 7
和 Windows 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
我正在尝试创建一个必须在 Windows 7
和 Windows 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