路径名中的空格会导致将输出管道传输到"find"时出现问题



当路径有空格或使用变量时,无法使用%var%测试程序的输出尝试了以下脚本,只有最后一个有效(任务数为"0"(

SET MYTEST1="C:Program FilesBoinc"
SET MYTEST2="C:Progra~1Boinc"
FOR /F "tokens=* USEBACKQ" %%F IN (`%MYTEST1%boinccmd.exe --get_tasks ^| find /i /c "executing"`) DO (
SET NumMasterTasks=%%F
)
FOR /F "tokens=* USEBACKQ" %%F IN (`%MYTEST2%boinccmd.exe --get_tasks ^| find /i /c "executing"`) DO (
SET NumMasterTasks=%%F
)
FOR /F "tokens=* USEBACKQ" %%F IN (`C:Program Filesboincboinccmd.exe --get_tasks ^| find /i /c "executing"`) DO (
SET NumMasterTasks=%%F
)

FOR /F "tokens=* USEBACKQ" %%F IN (`C:Progra~1Boincboinccmd.exe --get_tasks ^| find /i /c "executing"`) DO (
SET NumMasterTasks=%%F
)

这是输出:

C:Program FilesBOINC>SET MYTEST1="C:Program FilesBoinc"
C:Program FilesBOINC>SET MYTEST2="C:Progra~1Boinc"
C:Program FilesBOINC>FOR /F "tokens=* USEBACKQ" %F IN (`"C:Program FilesBoinc"boinccmd.exe --get_tasks | find /i /c "executing"`) DO (SET NumMasterTasks=%F )
'C:Program' is not recognized as an internal or external command,
operable program or batch file.
C:Program FilesBOINC>FOR /F "tokens=* USEBACKQ" %F IN (`"C:Progra~1Boinc"boinccmd.exe --get_tasks | find /i /c "executing"`) DO (SET NumMasterTasks=%F )
The filename, directory name, or volume label syntax is incorrect.
C:Program FilesBOINC>FOR /F "tokens=* USEBACKQ" %F IN (`C:Program Filesboincboinccmd.exe --get_tasks | find /i /c "executing"`) DO (SET NumMasterTasks=%F )
'C:Program' is not recognized as an internal or external command,
operable program or batch file.
C:Program FilesBOINC>FOR /F "tokens=* USEBACKQ" %F IN (`C:Progra~1Boincboinccmd.exe --get_tasks | find /i /c "executing"`) DO (SET NumMasterTasks=%F )
C:Program FilesBOINC>(SET NumMasterTasks=0 )

有效的有两个问题:我想使用变量作为路径,而不是硬代码路径,不便的是,"程序文件"并不总是中的"Progra~1">

Directory of Y:
11/04/2019  10:12 AM    <DIR>                       .
11/04/2019  10:11 AM    <DIR>                       ..
11/04/2019  10:11 AM    <DIR>          PL6FPL~Q     Program Files
11/04/2019  10:12 AM    <DIR>          PT8A6Y~T     Program Files (x86)
0 File(s)              0 bytes
4 Dir(s)  4,778,356,477,952 bytes free

尝试了以下(谢谢Stephan!(

SET "ROOTBIN=C:Progra~1boinc"
FOR /F "tokens=* USEBACKQ" %%F IN (`%ROOTBIN%boinccmd.exe --get_tasks ^| find /i /c "executing"`) DO (
SET NumMasterTasks=%%F
)

但是,我使用了程序文件的短名称,如果我将该名称与该空格一起使用,脚本将失败。

C:Program FilesBOINC>SET "ROOTBIN=C:Progra~1boinc"
C:Program FilesBOINC>FOR /F "tokens=* USEBACKQ" %F IN (`C:Progra~1boincboinccmd.exe --get_tasks | find /i /c "executing"`) DO (SET NumMasterTasks=%F )
C:Program FilesBOINC>(SET NumMasterTasks=30 )

只要有文件夹或文件名,就必须引用完整构造
使用变量时,最佳做法是使用推荐的语法set "var=value"。引号确保所有属于一起的东西都在一起。(作为一个额外的好处,它还可以处理"毒字符"(如&<>(,而无需逃离它们(
使用此语法,引号是值的而不是部分,因此您必须稍后对字符串进行引号引用(这确保您可以完全控制稍后在代码中引用的内容(

删除带有路径的尾随只是个人偏好——我发现代码可读性更好("%ROOTBIN%boinccmd.exe""%ROOTBIN%boinccmd.exe"(

当使用正确的引号时,这里并不需要usebackq。这里也不需要tokens=*,因为| find /c只返回一个没有空格或其他文本的数字。

由于管道的原因,情况发生了一些变化。以下代码应该可以工作(使用... in ('" "command"|command "') do ...而不是试图转义正确的部分(:

SET "ROOTBIN=C:Program FilesBoinc"
FOR /F %%F IN ('" "%ROOTBIN%boinccmd.exe" --get_tasks | find /i /c "executing" "') DO (
SET NumMasterTasks=%%F
)
echo %NumMasterTasks%

最新更新