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

时间:2012-01-31 17:30:59

标签: 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

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

Windows XP:

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer
    Version     REG_SZ  8.0.6001.18702

Windows 7:

HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer
    Version    REG_SZ    9.0.8112.16421

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

if
  version == 8
then
  execute this
elseif
  version == 9
then
  execute that

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

非常感谢帮助。

PS。我看过Jerold Schulman's script,但它返回的版本号对我来说太过分了。

3 个答案:

答案 0 :(得分:6)

你需要整理所有这些作品

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

    REG QUERY "HKLM\Software\Microsoft\Internet Explorer" /v Version
    
  2. REG命令返回的信息中提取包含该版本的行。您可以将REG的输出传递到FIND命令。见HELP FIND

    REG ... | FIND "REG_SZ" 
    
  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
    )
    
  4. 从版本字符串中提取主版本号。在此期间使用delims=.进行解析。见HELP FOR。要适当扩展变量,必须使用扩展扩展并使用!语法来访问变量。另外,使用/A将其视为数字。见HELP SET

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

    IF .!m!==.8 (
      echo it's 8
    ) ELSE (
      ...
    
  6. 工作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
    

答案 1 :(得分:3)

在过去,在我完全停止使用Microsoft产品之前,我发誓从JP Software开始使用名为4DOS的产品。该公司仍然存在,他们保持了他们的产品线更新。它是商业软件,但它使DOS + Windows + OS / 2脚本变得轻而易举。 (是的,REXX不是一件轻而易举的事。)

4DOS还获得了诺顿的许可,并作为NDOS发布,与原始版本相比,它的压力更大。

也就是说,如果内存服务,你也应该能够使用SET命令来创建一个变量子串。

SET start=1
SET length=1
SET string=%IEVerReg%
CALL SET substribg=%%string:~%start%,%length%%%

我很想知道这是否有效。幸运的是,我没有Windows盒子来测试它。

答案 2 :(得分:2)

以下是对您链接的内容的略微修改似乎有效:

@echo off
setlocal
set qry=reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer" /v Version
set fnd=findstr /I /L /C:"REG_SZ"
for /f "Tokens=2*" %%u in ('%qry%^|%fnd%') do (
 set vsn=%%v
)
@echo %vsn:~0,1%
endlocal