2017-04-06 112 views
0

我得到3個Missing operator.行作爲輸出以下批處理腳本「缺少運營商批量for語句

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 
) 

起初我還以爲輸出從在for循環的3所Set陳述到來,但在調查我不再認爲這是問題。帶領我相信它與for聲明本身有關,但我無法弄清楚究竟是什麼錯誤。

我需要禁止這些警告,因爲此腳本的輸出將被記錄。

任何幫助表示讚賞,感謝,T.

編輯:我要補充的是,3個變量越來越設定正確的值。

+0

您是否嘗試過使用'+ ='而不是'+'? –

+0

剛剛嘗試過,沒有什麼區別 –

+1

如果它正在工作,但只是顯示錯誤,您可以通過在集合的末尾放置'> nul 2>&1'來禁止它們(它必須是錯誤的來源?) –

回答

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

我想,如果抑制的錯誤信息是確定適合你,然後用它留下來, 解析值的點分裂是IMO矯枉過正,但儘管如此:

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 
) 
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