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

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

如您所见,我正在将 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

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 命令行一无所知。

非常感谢您的帮助。

附言。我看过Jerold Schulman's script但它会返回整个版本号,这对我来说太多了。

最佳答案

你需要把所有这些部分放在一起

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

    REG QUERY "HKLM\Software\Microsoft\Internet Explorer" /v Version
    
  2. REG 命令返回的信息中提取包含版本的行。您可以通过管道将 REG 的输出传送到 FIND 命令中。请参阅帮助查找

    REG ... | FIND "REG_SZ" 
    
  3. 将结果设置到一个变量中。您可以使用 FOR/F 命令来完成。使用 tokens=3 提取返回行第三个位置的版本号。另请注意转义管道字符 | 所需的插入符号 ^。请参阅帮助

    FOR /F "tokens=3" %%a in ('REG QUERY "HKLM\Software\Microsoft\Internet Explorer" /v Version ^| FIND "REG_SZ"') DO (
      SET v=%%a
    )
    
  4. 从版本字符串中提取主版本号。使用delims=. 句号解析。请参阅 帮助。对于变量的适当扩展,您必须使用扩展扩展并使用 ! 语法来访问变量。此外,使用 /A 将其视为数字。请参阅帮助集

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

    IF .!m!==.8 (
      echo it's 8
    ) ELSE (
      ...
    

工作 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

关于windows - 如何从命令输出中查找和提取子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9084117/

相关文章:

windows - PC Emacs 启动时出错

php - sqlite 和窗口 : Not enough storage is available to complete this operation and CoInitialize has not been called

string - 如何使用 grep 查找文件夹内的单词?

linux - 从 "ps"获取完整结果

linux - 从虚拟盒子中删除已安装的linux系统

c++ - 在 windows 下对 Unix 下创建的文件使用 fstream::seekg

powershell - Powershell和FTP上传和重命名

javascript - 从 Hyperion Interactive Reporting Studio 内的 Javascript 将参数传递到批处理文件

windows - 如何在批处理脚本中刷新 PATH 环境变量

batch-file - 如何使用批处理文件复制(和增加)文件的多个实例