Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理脚本-将systeminfo命令的输出保存到变量_Windows_Batch File - Fatal编程技术网

Windows 批处理脚本-将systeminfo命令的输出保存到变量

Windows 批处理脚本-将systeminfo命令的输出保存到变量,windows,batch-file,Windows,Batch File,我很难保存以下命令的输出,这会将操作系统的名称保存到一个变量中 systeminfo | findstr /B /C:"OS Name" 我尝试使用如下所示的for循环,但是变量的值是OS for /f %%i in ('systeminfo ^| findstr /B /C:"OS Name" ') do set vard=%%i echo the operating system name 2 is %vard% 有人能帮我解决这个问题吗? 我研究了其他方法,例如将输出写入一个临时文件

我很难保存以下命令的输出,这会将操作系统的名称保存到一个变量中

systeminfo | findstr /B /C:"OS Name" 
我尝试使用如下所示的for循环,但是变量的值是
OS

for /f %%i in ('systeminfo ^| findstr /B /C:"OS Name" ') do set vard=%%i
echo the operating system name 2 is %vard%
有人能帮我解决这个问题吗? 我研究了其他方法,例如将输出写入一个临时文件,然后稍后再将其读回,但我希望在不使用临时文件的情况下实现这一点

@echo off
setlocal

set "vard="

for /f "tokens=1,2,* delims=: " %%i in ('systeminfo') do (
    if "%%~i %%~j" == "OS Name" (
        call :clean_spaces "%%~k"
        goto :next
    )
)

:next
echo the operating system name 2 is "%vard%"
exit /b

:clean_spaces
setlocal enabledelayedexpansion
set "string=%~1"
    :loop
    if "!string:~-1!" == " " (
        set "string=!string:~,-1!"
        goto :loop
    )
endlocal & set "vard=%string%"
用冒号和空格分隔。不幸的是,令牌
*
也 获取
systeminfo
输出的尾随空格

名为
:trim_spaces
的标签将修剪尾部空格 从
vard
存储的值。它是通过 检查最后一个字符是否为空格并将其删除。
它一直循环,直到不存在尾随空格。

要使用慢速
SystemInfo
方法(如在发布的代码中使用的方法),应使用已知的分隔符
对输出进行分隔

@Echo关闭
对于/F“Tokens=1*Delims=:”%%A In('SystemInfo^ | Find/I“OS Name”'
)Do Call:Sub%%B
回显操作系统名称2为%vard%
暂停
后藤:EOF
:Sub
设置“vard=%*”
退出/B
或者,您可以使用内置的WMI命令行,
WMIC.exe

@Echo关闭
对于('WMIC OS Get Name'中的/F“Skip=1 Delims=|”%%A
)为/F“Delims=“%%B In”(“%%%A”)执行Do调用:Sub%%A
回显操作系统名称2为%vard%
暂停
后藤:EOF
:Sub
设置“vard=%*”
退出/B
或者使用
Reg.exe
从注册表中检索信息:

@Echo关闭
对于/F“跳过=2个令牌=2*”%%A(
“注册查询”HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion“/V ProductName”
)不设置“vard=%%B”
回显操作系统名称2为%vard%
暂停
后藤:EOF

我建议您在cmd的命令提示符中键入
FOR/?
,然后仔细阅读帮助文本。这里甚至有一个如何提取特定令牌的示例。运行
systeminfo | findstr/B/C:“操作系统名称”
的输出如下:
OS Name:Microsoft Windows….
有多个由空格分隔的令牌,您将需要第二个令牌(
名称:
)后的剩余令牌可能重复