繁体   English   中英

操作系统名称变量

[英]OS Name Variable

我想运行一个脚本,在该脚本中我可以获取公司中所有正在运行的计算机的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

因此,基本上,我希望为Systeminfo的结果占位符,在制作系统变量时可以引用它并将其解析为SET命令。

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

不能完全确定您要查找的内容,但是我看到的最大问题是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的瑞士军刀。 有趣的事实:您甚至可以使用wmic 生成远程系统上已安装软件的网页表。

您给批次多了点功劳。 如果您运行echo %OS_NAME% ,它将立即显示systeminfo | find "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命令,因为它是自己的命令

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM