批处理语句中的“缺少运算符”

时间:2017-04-06 15:13:45

标签: batch-file cmd

我从以下批处理脚本获得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个变量正在设置正确的值。

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可以使用。