如何从命令输出中查找和提取子字符串?

Mic*_*l M 4 windows command-line batch-file

在我详细介绍之前,我想强调一下,使用PowerShell不是一种选择,因为脚本应该在PowerShell可能无法使用的机器上运行.

我需要检查Windows机器上安装的Internet Explorer版本,并根据它的版本对其进行操作.

到目前为止,我的批处理脚本如下所示:

@echo off
setlocal
for /f "tokens=*" %%a in ( 'reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer" /v Version' ) do ( set IEVerReg=%%a )
endlocal
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在reg query为IEVarReg变量分配输出.在不同的Windows版本上,输出是不同的,例如:

Windows XP:

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer
    Version     REG_SZ  8.0.6001.18702
Run Code Online (Sandbox Code Playgroud)

Windows 7的:

HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer
    Version    REG_SZ    9.0.8112.16421
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想从版本号中获取第一个数字并执行以下操作:

if
  version == 8
then
  execute this
elseif
  version == 9
then
  execute that
Run Code Online (Sandbox Code Playgroud)

我确定if一旦得到版本号,我就会弄清楚如何做这个部分,但这是我无法弄清楚的版本号部分.我可以在bash,perl等中轻松完成,但不知道Windows命令行.

非常感谢帮助.

PS.我看过Jerold Schulman的剧本,但它返回的版本号对我来说太过分了.

PA.*_*PA. 7

你需要整理所有这些部分

  1. 访问注册表以查询版本号.看到REG QUERY /?

    REG QUERY "HKLM\Software\Microsoft\Internet Explorer" /v Version
    
    Run Code Online (Sandbox Code Playgroud)
  2. REG命令返回的信息中提取包含该版本的行.您可以将输出汇总REGFIND命令中.看到HELP FIND

    REG ... | FIND "REG_SZ" 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将结果设置为变量.您可以使用该FOR /F命令执行此操作.使用tokens=3提取的版本号是在返回行的第三个位置.另请注意^逃脱管道角色所需的插入符号|.看到HELP FOR

    FOR /F "tokens=3" %%a in ('REG QUERY "HKLM\Software\Microsoft\Internet Explorer" /v Version ^| FIND "REG_SZ"') DO (
      SET v=%%a
    )
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从版本字符串中提取主版本号.使用delims=.在周期解析.见HELP FOR.要适当扩展变量,必须使用扩展扩展并使用!语法来访问变量.此外,用/A它来作为一个数字.看到HELP SET

    FOR /F "tokens=1 delims=." %%m in ('echo !v!') do (
      SET /A m=%%m
    )
    
    Run Code Online (Sandbox Code Playgroud)
  5. 最后,添加您的IE版本的逻辑

    IF .!m!==.8 (
      echo it's 8
    ) ELSE (
      ...
    
    Run Code Online (Sandbox Code Playgroud)

工作BAT的第一个版本必须是这样的......

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=3" %%a in ('REG QUERY "HKLM\Software\Microsoft\Internet Explorer" /v Version ^| FIND "REG_SZ"') DO (    
    set v=%%a 
    echo !v!
    FOR /F "tokens=1 delims=." %%m in ('echo !v!') do (
      SET /A m=%%m
    )
    IF !m! EQU 8 (
      echo it's 8
    ) ELSE (
      IF !m! EQU 9 (
        echo it's 9
      ) ELSE (
       echo norrrrr
      )
    )
)
endlocal
Run Code Online (Sandbox Code Playgroud)