Как найти и извлечь подстроку из вывода команды? - PullRequest
3 голосов
/ 31 января 2012

Прежде чем углубляться в детали, я хотел бы подчеркнуть тот факт, что использование PowerShell не является вариантом, поскольку предполагается, что сценарий запускается на компьютере, где PowerShell может быть недоступен.

Мне нужно проверить версию Internet Explorer, установленную на компьютере с Windows, и действовать в зависимости от того, какая это версия.

Пока мой пакетный скрипт выглядит так:

@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.

Помощь будет очень признательна.

PS. Я видел сценарий Джерольда Шульмана , но он возвращает весь номер версии, что для меня слишком много.

Ответы [ 3 ]

6 голосов
/ 31 января 2012

вам нужно собрать все эти части

  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 (
      ...
    

Первая версия работающей 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
3 голосов
/ 31 января 2012

В прежние времена, прежде чем я полностью прекратил использовать продукты Microsoft, я поклялся продуктом под названием 4DOS от JP Software .Компания все еще существует, и они сохранили свою продуктовую линейку в актуальном состоянии.Это коммерческое программное обеспечение, но оно делает скрипты для DOS + Windows + OS / 2 быстрым.(И да, REXX не так уж и прост.)

4DOS также была лицензирована Norton и выпущена как NDOS, которая получила немного больше прессы, чем оригинальная версия.

Тем не менее, если памятьслужит, вы также должны иметь возможность использовать команду SET для создания переменной подстроки.

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

Я хотел бы знать, если это работает.К счастью, у меня нет Windows-бокса для тестирования.

2 голосов
/ 31 января 2012

Вот небольшая модификация того, что вы связали с этим, похоже, работает:

@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
...