Batch file ';缺少运算符';语句的批处理

Batch file ';缺少运算符';语句的批处理,batch-file,cmd,Batch File,Cmd,我从下面的批处理脚本中得到了3个缺少的运算符。行作为输出 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 "%ValuesAre

我从下面的批处理脚本中得到了3个
缺少的运算符。
行作为输出

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个变量设置了正确的值。

我认为如果抑制错误消息对您来说是可以的,那么请继续, 分析要在点处拆分的值是过分的,但是:

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" (
        for /f "delims=." %%x in ("%%~A") do SET /A w3wp2ID+=%%x
        for /f "delims=." %%x in ("%%~B") do SET /A w3wp1ID+=%%x
        for /f "delims=." %%x in ("%%~C") do SET /A w3wpID+=%%x
    )
    SET ValuesAreSet=TRUE
)

我想如果你可以抑制错误信息,那就继续吧, 分析要在点处拆分的值是过分的,但是:

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" (
        for /f "delims=." %%x in ("%%~A") do SET /A w3wp2ID+=%%x
        for /f "delims=." %%x in ("%%~B") do SET /A w3wp1ID+=%%x
        for /f "delims=." %%x in ("%%~C") do SET /A w3wpID+=%%x
    )
    SET ValuesAreSet=TRUE
)

如果只需要小数点之前的值,只需使用
%~nI
展开方法,该方法将小数点之后的数字视为扩展,从而将其删除。(从技术上讲是四舍五入)

设置“ValuesAreSet=FALSE”
对于/F“令牌=2-4个Delims=,”%%A In(
'typeperf-sc 1-y“\Process(w3wp*)\ID Process”^查找/V“\\”^查找/V“请稍候…”
)如果“%ValuesAreSet%”==“FALSE”(设置“w3wp2ID=%%~nA”)则执行此操作
设置“w3wp1ID=%%~nB”
设置“w3wpID=%%~nC”
设置“ValuesAreSet=TRUE”
)

如果只需要小数点之前的值,只需使用
%~nI
展开方法,该方法将小数点之后的数字视为扩展,从而将其删除。(从技术上讲是四舍五入)

设置“ValuesAreSet=FALSE”
对于/F“令牌=2-4个Delims=,”%%A In(
'typeperf-sc 1-y“\Process(w3wp*)\ID Process”^查找/V“\\”^查找/V“请稍候…”
)如果“%ValuesAreSet%”==“FALSE”(设置“w3wp2ID=%%~nA”)则执行此操作
设置“w3wp1ID=%%~nB”
设置“w3wpID=%%~nC”
设置“ValuesAreSet=TRUE”
)

尽管对于这种特定情况,这可能是解决当前问题的最佳解决方案,但我仍然想提供另一种方法:让
set/A
命令进行变量展开,因为如果存储非数值,这不会产生错误;相反,第一个非数字字符之前的所有内容都转换为带符号的32位整数,省略前导空格、有关符号的空格并强制将其转换为32位边界。例如:

set“VAR=-1.5 mV”&rem//(第一个非数字字符是`.`,因此整数是`-1`)
set/A“VAR=VAR”&rem/(`VAR`由`set/A`读取,因为没有`%%`被包围)
回显%VAR%(-预期为-1,不会出现错误消息)
设置/A“VAR=%VAR%”&rem/*(`VAR`在此处设置为'-1',但出现错误消息,
rem,因为'set/A'实际接收字符串'-1.5 mV`)*/
回显%VAR%(-预期为-1,出现错误消息)
在这里,此功能被实现到您的代码中;首先使用标准的
set
命令将值原封不动地存储,然后使用
set/a
命令将值转换为整数(请注意,
VAR=VAR
已被
VAR+=0
替换,只是不必在每条语句中两次声明每个变量名称):

set“ValuesAreSet=”
对于/F“令牌=2,3,4 delims=,”%%A in('
typeperf-sc 1-y“\Process(w3wp*)\ID Process”^
^|查找/V“\\”^查找/V“请稍候…”
“)如果未定义值,则不设置(
设置“w3wp2ID=%%~A”和设置/A“w3wp2ID+=0”
设置“w3wp1ID=%%~B”&设置/A“w3wp1ID+=0”
设置“w3wpID=%%~C”和设置/A“w3wpID+=0”
设置“ValuesAreSet=#”
)

此外,我更改了标志样式变量
ValuesAreSet
,通过空指示
FALSE
状态,通过非空指示
TRUE
状态,因此可以使用
if defined ValuesAreSet

尽管对于这种特定情况,这可能是解决当前问题的最佳方法,我仍然想贡献另一种方法:让
set/A
命令进行变量扩展,因为如果存储非数值,这不会引起错误;相反,第一个非数字字符之前的所有内容都转换为带符号的32位整数,省略前导空格、有关符号的空格并强制将其转换为32位边界。例如:

set“VAR=-1.5 mV”&rem//(第一个非数字字符是`.`,因此整数是`-1`)
set/A“VAR=VAR”&rem/(`VAR`由`set/A`读取,因为没有`%%`被包围)
回显%VAR%(-预期为-1,不会出现错误消息)
设置/A“VAR=%VAR%”&rem/*(`VAR`在此处设置为'-1',但出现错误消息,
rem,因为'set/A'实际接收字符串'-1.5 mV`)*/
回显%VAR%(-预期为-1,出现错误消息)
在这里,此功能被实现到您的代码中;首先使用标准的
set
命令将值原封不动地存储,然后使用
set/a
命令将值转换为整数(请注意,
VAR=VAR
已被
VAR+=0
替换,只是不必在每条语句中两次声明每个变量名称):

set“ValuesAreSet=”
对于/F“令牌=2,3,4 delims=,”%%A in('
typeperf-sc 1-y“\Process(w3wp*)\ID Process”^
^|查找/V“\\”^查找/V“请稍候…”
“)如果未定义值,则不设置(
设置“w3wp2ID=%%~A”和设置/A“w3wp2ID+=0”
设置“w3wp1ID=%%~B”&设置/A“w3wp1ID+=0”
设置“w3wpID=%%~C”和设置/A“w3wpID+=0”
设置“ValuesAreSet=#”
)

此外,我更改了标志样式变量
ValuesAreSet
,通过空指示
FALSE
状态,通过非空指示
TRUE
状态,因此可以使用
if defined ValuesAreSet

您是否尝试过使用
+=
而不仅仅是
+
,如果它起作用,但只是显示出来,没有区别