当路径有空格或使用变量时,无法使用%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%