当管道输出到“ find”时,路径名中的空格会引起问题

当路径包含空格或使用变量时,无法使用%var%测试程序的输出 尝试以下脚本,仅最后一个起作用(任务数为“ 0”)

SET MYTEST1="C:\Program Files\boinc\"
SET MYTEST2="C:\Progra~1\boinc\"

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 Files\boinc\boinccmd.exe --get_tasks ^| find /i /c "executing"`) DO (
SET NumMasterTasks=%%F
)


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

这是输出:

C:\Program Files\boinc>SET MYTEST1="C:\Program Files\boinc\"
C:\Program Files\boinc>SET MYTEST2="C:\Progra~1\boinc\"

C:\Program Files\boinc>FOR /F "tokens=* USEBACKQ" %F IN (`"C:\Program Files\boinc\"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 Files\boinc>FOR /F "tokens=* USEBACKQ" %F IN (`"C:\Progra~1\boinc\"boinccmd.exe --get_tasks | find /i /c "executing"`) DO (SET NumMasterTasks=%F )
The filename,directory name,or volume label syntax is incorrect.

C:\Program Files\boinc>FOR /F "tokens=* USEBACKQ" %F IN (`C:\Program Files\boinc\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 Files\boinc>FOR /F "tokens=* USEBACKQ" %F IN (`C:\Progra~1\boinc\boinccmd.exe --get_tasks | find /i /c "executing"`) DO (SET NumMasterTasks=%F )

C:\Program Files\boinc>(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

尝试了以下操作(谢谢斯蒂芬!)

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

但是,我使用了程序文件的简称,如果我在该空格中使用该名称,脚本将失败。

C:\Program Files\boinc>SET "ROOTBIN=C:\Progra~1\boinc\"

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

C:\Program Files\boinc>(SET NumMasterTasks=30 )

ysf871104 回答:当管道输出到“ find”时,路径名中的空格会引起问题

只要有文件夹或文件名,都必须引用完整结构
使用变量时,最佳实践是使用建议的语法set "var=value"。引号确保所有属于一起的东西保持在一起。 (另一个好处是,它也可以与“毒药”(例如&<>)一起使用,而不必逃避它们。)
使用这种语法,引号不是值的 部分,因此您必须稍后用引号引起来(这可以确保您完全控制以后在代码中引述的内容)

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

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

由于管道,情况有所变化。以下代码应该可以工作(使用... in ('" "command"|command "') do ...而不是尝试转义正确的部分):

SET "ROOTBIN=C:\Program Files\Boinc"
FOR /F %%F IN ('" "%ROOTBIN%\boinccmd.exe" --get_tasks | find /i /c "executing" "') DO (
    SET NumMasterTasks=%%F
)
echo %NumMasterTasks%
本文链接:https://www.f2er.com/3165267.html

大家都在问