Batch file 设置findstr结果的变量
我有一个bat文件,其中包含以下代码。它将内容漂亮地写入文本文件,我将稍微扩展这个脚本,我需要为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
`
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 #