2012-01-31 2 views
3

자세히 설명하기 전에 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 출력을 할당하고 볼 수 있듯이.

윈도우 XP :

! REG.EXE VERSION 3.0 

HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer 
    Version  REG_SZ 8.0.6001.18702 

윈도우 7 : 이상적으로

HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer 
    Version REG_SZ 9.0.8112.16421 

, 나는 버전 번호에서 첫 번째 자리를 얻을하고 싶은 OUPUT는, 예를 다른 Windows 버전에서 다른

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

나는 어떻게 해야할지 알아낼 것입니다. if 한 번 부품 번호를 얻었으나 알아낼 수없는 부품 번호를 얻는 것입니다. 나는 bash, perl 등에서 쉽게 할 수 있지만 Windows 명령 행에 대해서는 전혀 모른다.

도움말은 대단히 감사하겠습니다.

추신. 나는 Jerold Schulman's script을 보았지만 너무 많은 전체 버전 번호를 반환합니다.

답변

6

것은 당신이 버전 번호를 조회 할 수

  1. 접근이 조각 같이 레지스트리를 모두 넣어해야합니다. REG QUERY /?

    REG QUERY "HKLM\Software\Microsoft\Internet Explorer" /v Version 
    
  2. REG 명령에 의해 반환 된 정보의 버전이 포함 된 행을 추출 참조하십시오.REG의 출력을 FIND 명령으로 파이프하면됩니다.

    REG ... | FIND "REG_SZ" 
    
  3. HELP FIND 변수에 결과를 설정을 참조하십시오. 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. 마지막
  6. 참조 ... 작업 BAT의 첫 번째 버전이 같은해야

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

IE의 버전에 대한 귀하의 논리를 추가

@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

예전에는 Microsoft 제품 사용을 완전히 중단하기 전에 JP Software에서 4DOS라는 제품을 맹세했습니다. 회사는 여전히 존재하며 제품 라인을 최신 상태로 유지합니다. 상용 소프트웨어이지만 DOS + Windows + OS/2 스크립팅을 쉽게 만들었습니다. (예, REXX는 산들 바람이 아닙니다.)

4DOS도 Norton에서 라이센스를 받았으며 NDOS로 출시되었습니다. NDOS는 원래 버전보다 조금 더 많은 기능을 제공합니다.

그렇다면 메모리가 작동하면 SET 명령을 사용하여 변수 하위 문자열을 만들 수 있어야합니다.

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

나는 이것이 작동하는지 알고 싶습니다. 다행스럽게도 테스트 할 Windows 상자가 없습니다.

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 
+0

그렇게 명백하다! 감사! –

관련 문제