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先生,我已更正。 –