首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置findstr结果的变量

设置findstr结果的变量
EN

Stack Overflow用户
提问于 2019-07-20 00:32:02
回答 2查看 652关注 0票数 0

我有一个bat文件,其中包含以下代码。它很好地将内容写入到文本文件中,无论我如何扩展这个脚本,我都需要为findstr结果设置变量。

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

到目前为止,我是这样尝试的:

代码语言:javascript
复制
`
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 

`

我知道我可能遗漏了一些非常简单的东西,但通过一些谷歌搜索和一些背景,我有批处理文件,我很难找到它。

这是我的全部代码。

代码语言:javascript
复制
`
@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
`

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-07-20 01:21:39

代码语言:javascript
复制
@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正在将标准错误重定向到nul,插入符号告诉cmd >是要执行的命令的一部分,而不是for的一部分。

"tokens=1*delims字符上拆分每一行,因此冒号之前的部分被分配给%%a,而行的其余部分被分配给%%b

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

然后检测每个必需的字符串,并将其赋给一个变量。我简单地给我在#中使用的每个变量加上了前缀,这样我就可以使用set #来显示所有的变量,并且系统不会分配以#开头的变量。

票数 1
EN

Stack Overflow用户

发布于 2019-07-20 12:32:36

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

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

代码语言:javascript
复制
for /F "delims=" %%a in ('anyCommand with parameters') do set "variable=%%a"

例如,在您的示例中:

代码语言:javascript
复制
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命令中的每一行/变量而对每一行/变量进行测试,而是为所有行定义变量。为此,您可以根据每行冒号之前的描述创建变量的名称。

代码语言:javascript
复制
@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 #
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57116445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档