Batch file 设置findstr结果的变量

Batch file 设置findstr结果的变量,batch-file,Batch File,我有一个bat文件,其中包含以下代码。它将内容漂亮地写入文本文件,我将稍微扩展这个脚本,我需要为findstr结果设置变量 我尝试了以下选项,但没有成功 以下是我到目前为止是如何尝试的 ` systeminfo | set hostnme = findstr /c:"Host Name">>string.txt systeminfo | findstr set dimain = /c:"Domain">>string.txt set osnme = systemin

我有一个bat文件,其中包含以下代码。它将内容漂亮地写入文本文件,我将稍微扩展这个脚本,我需要为findstr结果设置变量

我尝试了以下选项,但没有成功

以下是我到目前为止是如何尝试的

`
systeminfo | set hostnme = findstr /c:"Host Name">>string.txt
systeminfo | findstr set dimain =  /c:"Domain">>string.txt 
set osnme =  systeminfo | findstr /c:"OS Name">>string.txt 

`
我知道我可能错过了一些超级简单的东西,但通过一些谷歌搜索和一些我与批处理文件有关的小背景,我很难找到它

这是我的全部代码

`
@echo on
echo Checking your system infor, Please wating... 
systeminfo | findstr /c:"Host Name">>string.txt
systeminfo | findstr /c:"Domain">>string.txt 
systeminfo | findstr /c:"OS Name">>string.txt 
systeminfo | findstr /c:"OS Version">>string.txt 
systeminfo | findstr /c:"System Manufacturer">>string.txt 
systeminfo | findstr /c:"System Model">>string.txt 
systeminfo | findstr /c:"System type">>string.txt 
systeminfo | findstr /c:"Total Physical Memory">>string.txt 
ipconfig | findstr IPv4>>string.txt
echo %hoo%
echo.

echo Hard Drive Space: 
wmic diskdrive get size>>string.txt

echo. 
echo.

echo Service Tag: 
wmic bios get serialnumber>>string.txt

echo. 
echo. 
echo CPU: 
wmic cpu get name>>string.txt

echo Completed! Thank you!
echo %ComputerName%

rename "string.txt" "%ComputerName%.txt"
echo Rename Completed! 
start "" http://www.localhost.com?txt=%ComputerName%

pause
`
我想把以下项目的每个结果作为变量,这样我就可以在代码的其他地方使用它们

systeminfo | findstr /c:"Host Name">>string.txt
systeminfo | findstr /c:"Domain">>string.txt 
systeminfo | findstr /c:"OS Name">>string.txt 
systeminfo | findstr /c:"OS Version">>string.txt 
systeminfo | findstr /c:"System Manufacturer">>string.txt 
systeminfo | findstr /c:"System Model">>string.txt 
systeminfo | findstr /c:"System type">>string.txt 
systeminfo | findstr /c:"Total Physical Memory">>string.txt 
ipconfig | findstr IPv4>>string.txt
@ECHO关闭
SETLOCAL
对于/f“tokens=1*delims=:”%%a IN('systeminfo 2^>nul')DO(
对于/f“令牌=*”%%r IN(“%%b”)DO(
如果/i“%%a”==“系统制造商”设置“#系统管理员=%%r”
如果/i“%%a”==“主机名”设置“#主机名=%%r”
如果/i“%%a”==“操作系统版本”设置“#操作系统版本=%%r”
)
)
回声------------------结果
设置#
后藤:eof
2^>nul
处理进度消息
2>nul
正在将stderr重定向到nul,插入符号告诉
cmd
要执行的
也是命令的一部分,而不是
部分

“tokens=1*
delims
字符上的每一行拆分,以便冒号前的部分分配给
%%a
,其余部分分配给
%%b

的内部
使用
标记=*
处理
%%b
中的前导空格(空格包含在默认分隔符集中)

然后检测每个需要的字符串并分配给一个变量。我只需在每个变量前面加上
前缀,这样我就可以使用
set
来显示它们,并且系统不会分配以
开头的变量。

@ECHO OFF
SETLOCAL
对于/f“tokens=1*delims=:”%%a IN('systeminfo 2^>nul')DO(
对于/f“令牌=*”%%r IN(“%%b”)DO(
如果/i“%%a”==“系统制造商”设置“#系统管理员=%%r”
如果/i“%%a”==“主机名”设置“#主机名=%%r”
如果/i“%%a”==“操作系统版本”设置“#操作系统版本=%%r”
)
)
回声------------------结果
设置#
后藤:eof
2^>nul
处理进度消息。
2>nul
正在将stderr重定向到nul,插入符号告诉
cmd
要执行的
也是命令的一部分,而不是
for
的一部分

“tokens=1*
delims
字符上的每一行拆分,以便冒号前的部分分配给
%%a
,其余部分分配给
%%b

的内部
使用
标记=*
处理
%%b
中的前导空格(空格包含在默认分隔符集中)


然后检测每个必需的字符串并分配给变量。我只是在我使用的每个变量前面加上
前缀,这样我就可以使用
set
来显示所有变量,并且系统不会分配以
开头的变量。

您没有指定
string.txt
文件的内容。您已请求将
findstr
命令的结果存储在变量中

获取任何命令的输出并将其分配给变量的标准方法如下:

for /F "delims=" %%a in ('anyCommand with parameters') do set "variable=%%a"
例如,在您的情况下:

for /F "tokens=2 delims=:" %%a in ('systeminfo ^| findstr /C:"Host Name"') do (
   for /F "tokens=*" %%b in ("%%a") do set "hostname=%%b"
)
第一个
for/F
命令获取冒号后的输出行部分。第二个
for/F
命令消除了该部分中的前导空格,而
set
命令将结果分配给
hostname
变量

代码中的一个不方便之处是,
systeminfo
是一个花费很高的命令,需要花费很长时间才能完成,因此使用它只提取一行,然后在下一行重复此命令是一种资源浪费。。。更好的方法是只运行一次
systeminfo
,然后从中提取所有需要的行

更好的方法不是在一系列
if
命令中测试每个所需的行/变量,以便单独定义每个行,而是为所有行定义变量。为此,您可以根据每行冒号前的描述创建变量的名称

@echo off
setlocal EnableDelayedExpansion

echo Please wait . . .
for /F "tokens=1* delims=:" %%a in ('systeminfo 2^>nul') do (
   set "varName=%%a"
   if "!varName:~0,1!" neq " " (
      for /F "tokens=*" %%c in ("%%b") do set "#!varName: =_!=%%c"
   )
)

set #

您尚未指定
string.txt
文件的内容。您已请求将
findstr
命令的结果存储在变量中

获取任何命令的输出并将其分配给变量的标准方法如下:

for /F "delims=" %%a in ('anyCommand with parameters') do set "variable=%%a"
例如,在您的情况下:

for /F "tokens=2 delims=:" %%a in ('systeminfo ^| findstr /C:"Host Name"') do (
   for /F "tokens=*" %%b in ("%%a") do set "hostname=%%b"
)
第一个
for/F
命令获取冒号后的输出行部分。第二个
for/F
命令消除了该部分中的前导空格,而
set
命令将结果分配给
hostname
变量

代码中的一个不方便之处是,
systeminfo
是一个花费很高的命令,需要花费很长时间才能完成,因此使用它只提取一行,然后在下一行重复此命令是一种资源浪费。。。更好的方法是只运行一次
systeminfo
,然后从中提取所有需要的行

更好的方法不是在一系列
if
命令中测试每个所需的行/变量,以便单独定义每个行,而是为所有行定义变量。为此,您可以根据每行冒号前的描述创建变量的名称

@echo off
setlocal EnableDelayedExpansion

echo Please wait . . .
for /F "tokens=1* delims=:" %%a in ('systeminfo 2^>nul') do (
   set "varName=%%a"
   if "!varName:~0,1!" neq " " (
      for /F "tokens=*" %%c in ("%%b") do set "#!varName: =_!=%%c"
   )
)

set #