2014-07-13 103 views
0

我在for循環中使用wmi時遇到問題。我只是想抓住操作系統版本的第一個數字來區分XP(5)和Win7(6)。批次wmi for循環

下面的工作可以很好地查詢單個機器。

for /f "tokens=1 delims=." %%a in ('wmic /node:%machine% os get version') do @for /f "tokens=1 delims=." %%b in ("%%a") do @set osver=%%b 
echo %osver% 

然而,一旦我試圖把它放在一個for循環中,我只得到一個空白%osver%

for /f %%G in (list.txt) do (
    for /f "skip=2 tokens=2 delims=.," %%a in ('wmic /node:%%G os get version /format:csv') do @for /f "tokens=1 delims=." %%b in ("%%a") do @set osver=%%b 
    echo %osver% 
) > results.txt 

我假設它是有問題,我跳過/標記/但我不確定如何確定它出錯的地方。我嘗試過的任何變體仍然會導致空行。

回答

0

我想說你錯了。

在塊語句(a parenthesised series of statements),所述整個塊被解析並然後執行。該塊內的任何%var%將在該塊被解析時由該變量的值取代 - 在塊執行之前 - 同樣的事情適用於FOR ... DO (block)

因此,在遇到IF時,將使用%variables%的值執行IF (something) else (somethingelse)。克服這個

兩種常用方法是:1)使用setlocal enabledelayedexpansion並使用!var!代替%var%訪問的var改變的值或2),以調用一個子程序使用改變的值來執行進一步的處理。

因此請注意使用CALL ECHO %%var%%,它顯示var的更改值。 CALL ECHO %%errorlevel%%顯示,但遺憾的是,然後RESETS錯誤級別。

所以,我預測call echo %%osver%%代替echo %osver%將解決您的問題。

OTOH,echo %%b可能會更容易和更快。


for /f %%G in (list.txt) do (
for /f "skip=2 tokens=2 delims=.," %%a in (
    'wmic /node:%%G os get version /format:csv' 
) do for /f "tokens=1 delims=." %%b in ("%%a") do (
    set osver=%%b 
    echo %%b 
) 
CALL echo %%osver%% 
) > results.txt 
0

你也不要有設置%% b鍵osver,如果你只需要呼應%% b的值可能會以及回聲%% B,因爲其本身它是一個變量只適用於聲明它的方法..如果你打算在體外使用它,你只能創建一個實例變量。

所以你應該堅持enabledelayedexpansion,如果你在其他地方使用它...

你也應該用括號括住你的語句以避免代碼混合起來......

+0

你如何回覆%% b本身? echo %% b顯示爲%b – user3358058

+0

只有當您使用批處理文件處理時,纔會回顯%% b;如果您正在使用命令行處理單個前面的%,則會回顯%% b .. – mordecai