我从以下批处理脚本获得3 Missing operator.
行作为输出
SET w3wp2ID=0
SET w3wp1ID=0
SET w3wpID=0
SET ValuesAreSet=FALSE
for /f "tokens=2,3,4 delims=," %%A in ('typeperf -sc 1 -y "\Process(w3wp*)\ID Process" ^| find /V "\\" ^| find /V "please wait..."') do (
if "%ValuesAreSet%"=="FALSE" (
SET /A w3wp2ID=%%~A+0
SET /A w3wp1ID=%%~B+0
SET /A w3wpID=%%~C+0
)
SET ValuesAreSet=TRUE
)
起初我认为输出来自forloop中的3个Set
语句,但经过调查我不再认为这是问题。让我相信它与for
语句本身有关,但我无法弄清楚到底出了什么问题。
我需要禁止这些警告,因为将记录此脚本的输出。
感谢任何帮助,谢谢,T。
编辑:我应该补充说,3个变量正在设置正确的值。
答案 0 :(得分:3)
如果您只想要小数点前的值,只需使用%~nI
扩展方法,该方法将小数点后的数字视为扩展名,从而删除它们。 (技术上将其四舍五入)。
SET "ValuesAreSet=FALSE"
For /F "Tokens=2-4 Delims=," %%A In (
'typeperf -sc 1 -y "\Process(w3wp*)\ID Process" ^| find /V "\\" ^| find /V "please wait..."'
) Do If "%ValuesAreSet%"=="FALSE" (SET "w3wp2ID=%%~nA"
SET "w3wp1ID=%%~nB"
SET "w3wpID=%%~nC"
SET "ValuesAreSet=TRUE"
)
答案 1 :(得分:1)
我认为如果压缩错误消息对你没问题,那么请坚持下去, 解析要在点处拆分的值是IMO矫枉过正,但仍然是:
ul
答案 2 :(得分:1)
虽然对于这个特定情况,method explained by Compo可能是解决当前问题的最佳解决方案,但我仍然希望提供另一种方法:让set /A
命令执行变量扩展,因为这不是如果存储非数字值,则上升错误;相反,直到第一个非数字字符的所有内容都将转换为带符号的32位整数,省略前导空格,关于符号并将其强制转换为32位边界。例如:
set "VAR= -1.5 mV" & rem // (the first non-numeric char. is `.`, so the integer is `-1`)
set /A "VAR=VAR" & rem // (`VAR` is read by `set /A`, because no `%%` are surrounded)
echo %VAR% (-1 expected, no error message arises)
set /A "VAR=%VAR%" & rem /* (`VAR` becomes set to `-1` here, but an error message appears,
rem because `set /A` actually receives the string ` -1.5 mV`) */
echo %VAR% (-1 expected, an error message arises)
此功能已在您的代码中实现;这些值首先使用标准set
命令保持不变,然后通过set /A
命令转换为整数(请注意VAR=VAR
已被VAR+=0
替换,只是没有每个语句两次声明每个变量名称:
set "ValuesAreSet="
for /F "tokens=2,3,4 delims=," %%A in ('
typeperf -sc 1 -y "\Process(w3wp*)\ID Process" ^
^| find /V "\\" ^| find /V "please wait..."
') do if not defined ValuesAreSet (
set "w3wp2ID=%%~A" & set /A "w3wp2ID+=0"
set "w3wp1ID=%%~B" & set /A "w3wp1ID+=0"
set "w3wpID=%%~C" & set /A "w3wpID+=0"
set "ValuesAreSet=#"
)
此外,我更改了标志式变量ValuesAreSet
以通过为空来指示FALSE
状态,并将TRUE
状态更改为非空,因此if defined ValuesAreSet
可以使用。