1

我想运行一个脚本,我可以在其中获取公司中运行的所有计算机的 Windows 名称和系统版本,并将其放入文本文件中。然后用我的 windows name 制作一个系统变量。我知道要运行什么,但我遇到问题的地方是占位符。所以这是我的代码:

    :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

所以基本上我想要一个 Systeminfo 结果的占位符,当我制作我的系统变量时,我可以参考并解析我的 SET 命令。

谢谢,任何帮助将不胜感激。

4

2 回答 2

4

不完全确定您在寻找什么,但我看到的最大问题是它systeminfo需要永远运行并返回比您正在寻找的更多信息。您最好使用捕获 wmi 查询wmic。这基本上是对您的示例脚本的重写,只是使用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 的瑞士军刀。有趣的事实:您甚至可以使用它wmic生成远程系统上已安装软件的网页表。

于 2013-04-16T18:40:21.750 回答
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.)|用 a 转义^,这需要在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按照自己的命令进行处理

于 2013-04-16T17:12:38.980 回答