2014-03-30 197 views
0

我寫了下面的腳本,在我的系統上工作得非常好。批處理腳本相關問題

@echo off 

setlocal enabledelayedexpansion 

FOR /F %%i IN ('wmic /node:%1 computersystem get Name') DO SET A=%%i 
FOR /F %%i IN ('wmic /node:%1 computersystem get Domain') DO SET B=%%i 
FOR /F %%i IN ('wmic /node:%1 computersystem get UserName') DO SET C=%%i 
FOR /F %%i IN ('wmic /node:%1 computersystem get Manufacturer') DO SET D=%%i 
FOR /F "delims=" %%i IN ('wmic /node:%1 computersystem get Model') DO SET E=%%i 
FOR /F %%i IN ('wmic /node:%1 computersystem get SystemType') DO SET F=%%i 
FOR /F %%i IN ('wmic /node:%1 bios get SerialNumber') DO SET G=%%i 
FOR /F "delims=|" %%i IN ('wmic /node:%1 os get Name') DO SET H=%%i 
FOR /F %%i IN ('wmic /node:%1 os get TotalVisibleMemorySize') DO (SET J=%%i) 

SET /a J=%J%/1024 

FOR /F "delims=" %%i IN ('wmic /node:%1 cpu get Name') DO SET K=%%i 
echo %A%,%B%,%C%,%D%,%E%,%F%,%G%,%H%,%J% MB,%K% >> output.csv 

但是,在下面顯示的一些修改中,它不顯示任何信息。

@echo off 

setlocal enabledelayedexpansion 

ping -n 1 %1 | find "TTL=" > NUL 
IF NOT ERRORLEVEL 1 (

FOR /F %%i IN ('wmic /node:%1 computersystem get Name') DO (SET A=%%i) 
FOR /F %%i IN ('wmic /node:%1 computersystem get Domain') DO (SET B=%%i) 
FOR /F %%i IN ('wmic /node:%1 computersystem get UserName') DO (SET C=%%i) 
FOR /F %%i IN ('wmic /node:%1 computersystem get Manufacturer') DO (SET D=%%i) 
FOR /F "delims=" %%i IN ('wmic /node:%1 computersystem get Model') DO (SET E=%%i) 
FOR /F %%i IN ('wmic /node:%1 computersystem get SystemType') DO (SET F=%%i) 
FOR /F %%i IN ('wmic /node:%1 bios get SerialNumber') DO (SET G=%%i) 
FOR /F "delims=|" %%i IN ('wmic /node:%1 os get Name') DO (SET H=%%i) 
FOR /F %%i IN ('wmic /node:%1 os get TotalVisibleMemorySize') DO (SET J=%%i) 

SET J=%J%/1024 

FOR /F "delims=" %%i IN ('wmic /node:%1 cpu get Name') DO (SET K=%%i) 

echo %A%,%B%,%C%,%D%,%E%,%F%,%G%,%H%,%J%,%K% >> output.csv 

) 

它也沒有給出任何錯誤。但是,生成的output.csv文件不包含任何數據。

回答

1

變化

IF NOT ERRORLEVEL 1 (

IF NOT %ERRORLEVEL%==1 (

雖然,我不知道ping回覆看起來是一樣的,當IPv6的使用而不是IPv4協議。您可能需要進一步調查(例如,是IPv6回覆的TTL部分?)。例如:

c:\>ping localhost 

Pinging Laptop_Name [::1] with 32 bytes of data: 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 

Ping statistics for ::1: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 0ms, Maximum = 0ms, Average = 0ms 
+0

仍然,輸出文件的內容沒有變化。它不顯示任何數據。 –

1

延遲擴展

當CMD解析器到達行線(在括號surounded行)的塊,所有的變量讀取被替換爲它們具有在分析時的值,之前執行該塊中的行。如果變量的值在塊內部發生更改,則在更改值的行中不會看到此更改,因爲此讀取已被更改前的變量值替換。

因此,在第二個代碼中,變量正在改變它的值,但是在輸出文件的最後一個回顯中,由於變量讀取的值被替換爲值更改之前的值,因此不會輸出數據。在塊執行開始之前,變量沒有任何值。

如果你想保持這種風格的代碼,你需要啓用延遲擴展,並將變量中的sintax改爲讀取/值擴展直到執行時間。

setlocal enabledelayedexpansion 
.... 
if not errorlevel 1 (
    .... 
    echo !a!, !b!, !c! 
) 

算術

SET J=%J%/1024SET /A J=!J!/1024,算術需要SET /A

PING

由於JamesL表示他的回答,在IPv6的情況下,不存在「 TTL =「ping命令輸出中的數據。

在ipv4 ping命令集中errorlevel是否丟包。在ping一個非活動的同一子網機器時,你將不會丟失數據包。因此,在ipv4中測試主動機器的最佳方法是測試輸出中的TTL=值。

在ipv6中,沒有TTL輸出,但是現在,ping一個同一個子網非活動機器,您將獲得所有丟包。並且只有在所有數據包都丟失的情況下才會設置錯誤級別。如果有任何數據包到達目標,錯誤級別未設置

因此,對於IPv4,測試TTL=,對於IPv6測試errorlevel

WMIC

在檢索數據的這種方式是正確的,將工作,在單個查詢中檢索所有可能的數據效率更高(就像您在之前的問題中所做的那樣)。對於computersystem數據的六個呼叫應該寫成單個wmic呼叫。

+0

@MandarShinde,你在我編輯時發佈的。請參閱已編輯的答案 –

+0

我在生成的文件(output.csv)中發現,無論我使用了「」delim =「',隨後的輸出將打印在下一行(用MS Excel打開文件時) 。第一行顯示名稱,域名,用戶,製造商和模型。第二行顯示其餘的數據。爲什麼這樣? –

+0

@MandarShinde,wmic的輸出在每行的結尾包含一個附加的回車符。當您將wmic輸出中的最後一個字段分配給一個變量時,該變量將包含指定的回車符。你可以在一個附加的'for'後面處理這個變量來消除它,或者如果可能的話,在wmic查詢中包含一個將不被檢索的adicalal結束字段。 –