首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打印批处理脚本中第二个令牌之后的所有令牌

打印批处理脚本中第二个令牌之后的所有令牌
EN

Stack Overflow用户
提问于 2013-06-27 02:14:35
回答 2查看 5.7K关注 0票数 1

我正在寻找一种更干净的方式来做这件事。我非常确定这是错误的,即使它有点工作。基本上,我从一个文件(temp.txt)中获取如下输出:

代码语言:javascript
运行
复制
    Host Name:                 IBM-3J93A46MRS5
    OS Name:                   Microsoft Windows 7 Professional 
    OS Version:                6.1.7631 Service Pack 1 Build 7601
    OS Configuration:          Standalone Workstation
    Registered Owner:          IAMADMIN
    Original Install Date:     2011-12-15, 10:56:07 AM
    System Boot Time:          2013-05-27, 9:55:36 AM
    System Manufacturer:       DELL
    System Model:              4009BF7
    Time Zone:                 (UTC-05:00) Eastern Time (US & Canada)
    Total Physical Memory:     16,316 MB
    Available Physical Memory: 11,356 MB

并尝试将第二列数据转换为变量。取决于我是否想要它。我正在使用Findstr来清除。

代码语言:javascript
运行
复制
    @echo off
    setlocal enabledelayedexpansion

    systeminfo > temp.txt
    set "tmp_result_file=temp.txt"

    for /f "tokens=3-7 delims= " %%i in ('FINDSTR /C:"OS Name:" %tmp_result_file%') do set "OSNAME=%%i %%j %%k %%l"
    for /f "tokens=3-10 delims= " %%i in ('FINDSTR /V /C:"BIOS Version:" %tmp_result_file%^|FIND /I "OS Version:"') do set "OSVER=%%i %%j %%k %%l %%m %%n %%o %%p"
    for /f "tokens=4-7 delims= " %%i in ('FINDSTR /C:"Original Install Date:" %tmp_result_file%') do set "INSTDATE=%%i %%j %%k %%l"
    for /f "tokens=3-7 delims= " %%i in ('FINDSTR /C:"System Manufacturer:" %tmp_result_file%') do set "SYSMFG=%%i %%j %%k %%l"
    for /f "tokens=3-7 delims= " %%i in ('FINDSTR /C:"System Model:" %tmp_result_file%') do   set "SYSMDL=%%i %%j %%k %%l"

    echo.
    echo Operating System      : %OSNAME% , %OSVER% 
    echo Original Install Date : %INSTDATE%
    echo Model Information     : %SYSMFG% %SYSMDL% 

我不喜欢我如此精确地使用标记,我只需要搜索值之后的所有内容。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-27 03:46:50

不需要延迟扩展、临时文件或FINDSTR,当然也不需要计算以空格分隔的标记。您只需设置正确的DELIMS和令牌选项。第一个FOR /F处理systeminfo的输出,并将每一行解析为名称和值。第二个/F从每个值中去掉了前导空格。剩下的就是一系列IF语句,用于测试每个名称并根据需要设置所需的变量。

代码语言:javascript
运行
复制
@echo off
setlocal

for /f "delims=: tokens=1*" %%A in ('systeminfo') do (
  for /f "tokens=*" %%S in ("%%B") do (
    if "%%A"=="OS Name" set "OSNAME=%%S"
    if "%%A"=="OS Version" set "OSVER=%%S"
    if "%%A"=="Original Install Date" set "INSTDATE=%%S"
    if "%%A"=="System Manufacturer" set "SYSMFG=%%S"
    if "%%A"=="System Model" set "SYSMDL=%%S"
  )
)

echo(
echo Operating System      : %OSNAME%, %OSVER%
echo Original Install Date : %INSTDATE%
echo Model Information     : %SYSMFG% %SYSMDL%

如果想要捕获更多的值,可能需要使用字符串指定搜索字符串:变量名对,并添加一些额外的FOR循环来处理每个测试,如下所示:

代码语言:javascript
运行
复制
@echo off
setlocal

for /f "delims=: tokens=1*" %%A in ('systeminfo') do for %%S in (
  "OS Name:OSNAME"
  "OS Version:OSVER"
  "Original Install Date:INSTDATE"
  "System Manufacturer:SYSMFG"
  "System Model:SYSMDL"
) do for /f "delims=: tokens=1*" %%a in ("%%~S") do if %%A==%%a (
  for /f "tokens=*" %%s in ("%%B") do set "%%b=%%s"
)

echo(
echo Operating System      : %OSNAME%, %OSVER%
echo Original Install Date : %INSTDATE%
echo Model Information     : %SYSMFG% %SYSMDL%
票数 5
EN

Stack Overflow用户

发布于 2013-06-27 02:27:19

如果需要获取第三个令牌之后的所有内容,只需在令牌值中使用通配符,如下所示:-

代码语言:javascript
运行
复制
for /f "tokens=3* delims= " %%i in ('FINDSTR /C:"OS Name:" %tmp_result_file%') do set "OSNAME=%%i"

应显示

代码语言:javascript
运行
复制
Microsoft Windows 7 Professional
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17327512

复制
相关文章

相似问题

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