1

我想運行一個腳本,在那裏我可以獲取Windows公司中運行的所有計算機的系統名稱和版本,並將其放入文本文件中。然後用我的Windows名稱創建一個系統變量。我知道該跑什麼,但我遇到問題的地方是一個佔位符。所以這裏是我的代碼:操作系統名稱變量

:OS_NAME 
    Set OS_NAME= systeminfo | find "OS Name" 

    :OS_Ver 
    Set OS_Version= systeminfo | findstr /B /C:"OS Version" 

    systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /c:"BIOS Version" | >> G:\Directory\%Computername% 

    :OS_Arch 
    IF exist "%programfiles(x86)% (SET OS_ARCH=X64) 
    Else (SET OS_ARCH=X86) 

    :Win_7 
    systeminfo | find "Microsoft Windows 7" > nul 
     if %ERRORLEVEL% == 0 (
      goto ver_7) 


    :Ver_7 
    Set Win7= systeminfo | find "Microsoft Windows 7" 
    Echo %computername% is running %WIN7% in %OS_ARCH% Environment >> G:\Directory\Win7Comps.txt 

所以基本上我想對於系統的系統信息的結果,我可以參考和解析它在我的SET命令時,我讓我的系統變量的佔位符。

謝謝,任何幫助將appreaciated。

回答

3

不完全知道你在尋找什麼,但我看到的最大的問題是,systeminfo需要永遠運行和返回比你正在尋找更多的信息。使用wmic可以更好地捕獲wmi查詢。這基本上是對示例腳本的重寫,只是使用wmic而不是systeminfo。它應該更快,更快。

@echo off 
setlocal 
set prefix=G:\Directory 

for /f "usebackq tokens=1,2 delims==|" %%I in (`wmic os get name^,version /format:list`) do 2>NUL set "%%I=%%J" 
for /f "tokens=2 delims==" %%I in ('wmic bios get version /format:list') do set "bios=%%I" 
for /f "tokens=2 delims==" %%I in ('wmic computersystem get model /format:list') do set "model=%%I" 

>>"%prefix%\%COMPUTERNAME%" echo OS Name: %name% 
>>"%prefix%\%COMPUTERNAME%" echo OS Version: %version% 
>>"%prefix%\%COMPUTERNAME%" echo PC Model: %model% 
>>"%prefix%\%COMPUTERNAME%" echo BIOS Version: %bios% 

if defined PROGRAMFILES(x86) (set arch=X64) else set arch=X86 

if "%name%" neq "%name:Windows 8=%" (
    set out=%prefix%\Win8Comps.txt 
) else if "%name%" neq "%name:Windows 7=%" (
    set out=%prefix%\Win7Comps.txt 
) else if "%name%" neq "%name:Windows Vista=%" (
    set out=%prefix%\WinVistaComps.txt 
) else if "%name%" neq "%name:Windows XP=%" (
    set out=%prefix%\WinXPComps.txt 
) 

>>"%out%" echo %COMPUTERNAME% is running %name% in %arch% environment 

更多信息類型wmic /?,並嘗試wmic computersystem get /?或類似地看到,可每個類下被查詢的項目清單。


wmic是Windows的瑞士軍刀。有趣的是:您甚至可以在遠程系統上使用已安裝軟件的wmicgenerate a web page表。

+0

你的腳本太棒了!並完美的作品!你能爲我分解一下嗎?或在那裏添加評論? – Samster

+0

@Sami_Sheikh - 當然,但可能不會到星期一。如果我有機會,我會插入詳盡的評論,並將其放在pastebin或類似的你。 – rojo

+0

@Sami_Sheikh - 好的,我爲你粘貼了一個[嚴重評論版](http://pastebin.com/U8g3S6gh)這個腳本。 – rojo

1

你給批量太多信用。如果你運行echo %OS_NAME%,它會直接回顯systeminfo | find "OS Name"。批量變量總是會擴大,不會再進一步​​處理。當您嘗試將變量設置爲時,這也可能會嘗試運行find "OS Name"不會被轉義,也不會被雙引號括起來。

如果您希望將命令的輸出設置爲一個值,你必須抓住它在for聲明是這樣的:

for /f "tokens=2 delims=:" %%a in ('systeminfo ^| find "OS Name"') do set OS_Name=%%a 

然後取出前導空格是這樣的:(有可能是一個更好的方式來做到這一點)

for /f "tokens=* delims= " %%a in ("%OS_Name%") do set OS_Name=%%a 

這裏有幾件事要注意。 1.)"tokens=2 delims=:"將分隔符設置爲並且它僅選擇第二部分,它將僅拉取所需的部分。 2.)|^轉義,這需要在for循環中完成,或者之後的任何操作都會嘗試執行單獨的命令。 3.)"tokens=* delims= "這裏的標記是*這是所有的標記。

我發現了一些其他問題。

systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /c:"BIOS Version" | >> G:\Directory\%Computername% 

這有一個額外的|字符在最後。這裏

IF exist "%programfiles(x86)% (SET OS_ARCH=X64) 
Else (SET OS_ARCH=X86) 

兩個問題,你沒有完成雙引號路徑周圍,並else必須在同一行的if語句的結束括號,就像這樣:

IF exist "%programfiles(x86)% (SET OS_ARCH=X64 
) Else (SET OS_ARCH=X86) 

否則,它會嘗試處理else,因爲它是自己的命令

+0

這裏有個錯字:'1.)「tokens = 2 delims =」將分隔符設置爲:':) – Endoro

+0

ty先生,我已更正。 –