[英]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 /?
或类似内容,以查看可以在每个课程下查询的项目列表。
您给批次多了点功劳。 如果您运行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.