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