设置findstr结果的变量

时间:2019-07-19 16:32:01

标签: batch-file

我有一个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

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
FOR /f "tokens=1*delims=:" %%a IN ('systeminfo 2^>nul') DO (
 FOR /f "tokens=*" %%r IN ("%%b") DO (
  IF /i "%%a"=="System Manufacturer" SET "#sys_man=%%r"
  IF /i "%%a"=="Host Name" SET "#hostname=%%r"
  IF /i "%%a"=="OS Version" SET "#osversion=%%r"
 )
)

ECHO ------------------- results
SET #
GOTO :eof

2^>nul处理进度消息。插入符号告诉2>nul cmd正在将stderr重定向到nul,>也是该命令的一部分,而不是for的一部分。

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

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

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

答案 1 :(得分:1)

您尚未指定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命令中的每个所需行/变量进行 not 测试,以便分别定义每个命令/变量,而只需为以下变量定义所有行。为此,您可以根据描述在每行的冒号前创建变量的名称

@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 #