배치 파일을 만들다 보면 윈도우 버전에 따라 그 명령을 달리하거나 값을 달리 적용해야 할 때가 있습니다. 그럴 땐 현재 윈도우의 버전을 변수로 저장하고 이에 맞춰 적절한 명령을 내리도록 만들어줘야 하죠. 다행히도 Ver 명령을 통해 명령 프롬프트에서 윈도우의 버전을 확인할 수 있습니다.




2K, XP 의 5.x 버전과 비스타, 7, 8 의 6.x 버전의 출력 결과가 조금은 다르지만 어쨌든 [Version x.x.xxxx] 부분은 동일한 것을 확인할 수 있습니다. 그래서 for /F (delims=[, delims=]) 를 통해 먼저 Version x.x.xxxx 를 추출하고, 이 값을 토대로 다시 x.x.xxxx 를 추출하여 %WinBuild% 변수로 저장하였습니다.

이제 여기에서 1 배치 파일은 for /F delims=. 을 통해 버전을 A, B, C 로 나눈 후 이를 대조하였고, 2 배치 파일은 그냥 %WinBuild% 변수에서 필요한 만큼만 추출하여 대조한 후 마지막으로 %WinVer% 변수로 저장하였습니다.

A = 5, B = 00 : 2K (윈도우 2000)
A = 5, B = 1 : XP (윈도우 XP)
A = 6, B = 0 : Vst (윈도우 비스타)
A = 6, B = 1 : Svn (윈도우 7)
A = 6, B = 2 : Eit (윈도우 8)

C 의 빌드 넘버까지 대조하면 서비스 팩까지 확인이 가능하지만 굳이 그렇게 까지 자세하게 나눌 필요는 없어 보입니다. 코드는 2 배치 파일이 더 깔끔하지만 2K 가 0 이 아니라 00 인지라 그것까지 고려하고, 뒤의 빌드넘버까지 생각한다면 1 배치 파일처럼 그냥 for /F 로 다시 나누는 게 더 좋아 보입니다. 물론 현재 상황에서 2K 는 사실상 고려할 필요가 없다고 할 수 있고, 그렇다면 2 배치 파일로도 전혀 문제가 없지만 말입니다.


여기에 더해 윈도우 폴더의(%windir%) SysWOW64 폴더의 존재 유무를 통해 32비트 버전과 64비트 버전을 확인하였고 %WinBit% 변수로 저장하였습니다. 다른 방법도 있지만 이게 제일 간단하고 이렇게만 해도 별 무리는 없어 보입니다.


이제 이렇게 저장한 %WinVer% 변수와 %WinBit% 변수를 통해 필요할 때 명령을 분기시키시면 됩니다.


참고로 for /F 구문의 중첩을 위해 확장 지연 변수를 사용하였고, 그래서 다른 배치 파일에 해당 코드를 끼워넣더라도 setlocal enabledelayedexpansion 을 반드시 함께 지정해주셔야 합니다. 그것 외에는 별로 주의할 건 없습니다.


이러한 윈도우 버전의 확인은 제가 제작한 배치 파일들에서 종종 사용했는데 거의 필요할 때마다 다시 만드는 경우가 많았죠. 그래서 배치 파일끼리 대충 비슷하지만 뭔가 조금씩 다르곤 합니다. 제 배치 파일에서 공통적으로 자주 사용되는 부분이기에 이번에 깔끔하게 정리해봤습니다. 자꾸 예전에 뭘 해놨는지 까먹는단 말이죠. ^^; 배치 파일을 좀 더 깔끔하게 짤 수 있으면 좋을텐데 제 실력은 여기까지네요. ^^;;; 이상입니다.

 

 

캐플 블로그에 공개된 글은 반드시 원본 글의 링크를 포함시키는 조건으로 자유롭게 이용하실 수 있습니다.
하지만 블로그의 발전을 위하여 되도록이면 링크로 글을 소개해주시길 부탁드립니다. ^^

- 상업적인 용도의 사이트는 대상에서 제외됩니다. -
- 글에는 오류가 있을 수 있고, 추후 수정 또는 재발행될 수 있습니다. -
  1. 정상기 2013.03.13 14:22 신고  댓글주소  수정/삭제  댓글쓰기
    문의좀 드리겠습니다.

    현재 PE로 부팅한 상태구요.
    PE에서 배치파일로 C:\드라이브의 윈도우버전 (XP 와 윈도우7,8) 을 알아내려고 하는데요

    방법좀 가르쳐 주시면 감사하겠습니다.
    • BlogIcon CApple 2013.03.13 15:22 신고  댓글주소  수정/삭제
      http://cappleblog.co.kr/522

      글에 보시면 아시겠지만 레지스트리에서 윈도우의 버전을 확인할 수 있습니다. 이를 활용하는 방법이 좋을 듯 합니다. 일단 PE 상에서 설치된 윈도우의 해당 레지스트리 하이브를 reg load 로드한 후(이 때 윈도우는 C: 라고 가정)

      [code]
      reg load HKLM\Temp C:\Windows\System32\Config\SOFTWARE
      [/code]

      이렇게 로드한 하이브에서 윈도우 버전이 저장된 레지스트리 값을 쿼리하는 게 가장 정확하지 않을까 생각되네요.

      [code]
      reg query "HKLM\Temp\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion
      [/code]

      쿼리 작업을 마쳤으면 로드했던 하이브는 언로드하고요.

      [code]
      reg unload HKLM\Temp
      [/code]

      이제 자동으로 확인하게 하려면 reg query 부분과 For /F 의 tokens 을 잘 조합하여 필요한 부분만 추출한 후 버전을 대조하는 식으로 작업하는 게 가장 확실할 듯 합니다.
  2. 정상기 2013.03.13 16:38 신고  댓글주소  수정/삭제  댓글쓰기
    아~~~ 캐플님..
    제가 배치파일이나 이런 언어에 문외한이다 보니.. 쩝~~!
    아래 캐플님 코드로 수정좀 부탁드려도 될까요?
    어디 검색해봐도 정말 없는 자료라서 이렇게 부탁드립니다.



    @echo off
    pushd %~dp0
    setlocal enabledelayedexpansion



    rem --- 윈도우 버전 체크 시작 ---

    rem Ver 명령에서 버전과 빌드 넘버 부분만 추출

    for /F "tokens=2 delims=[" %%a in ('VER') do (
    set WinBuild=%%a

    for /F "tokens=1 delims=]" %%b in ("!WinBuild!") do (
    set WinBuild=%%b

    for /F "tokens=2" %%c in ("!WinBuild!") do (
    set WinBuild=%%c
    )
    )
    )


    rem 버전과 빌드 넘버를 하나씩 해체하여 추출

    for /F "tokens=1 delims=." %%d in ("%WinBuild%") do (
    set VerA=%%d
    )

    for /F "tokens=2 delims=." %%e in ("%WinBuild%") do (
    set VerB=%%e
    )

    for /F "tokens=3 delims=." %%f in ("%WinBuild%") do (
    set VerC=%%f
    )


    rem 추출한 버전 번호에 따라 윈도우의 버전을 WinVer 로 저장

    if "%VerA%" == "5" (
    if "%VerB%" == "00" set WinVer=2K
    if "%VerB%" == "1" set WinVer=XP
    )

    if "%VerA%" == "6" (
    if "%VerB%" == "0" set WinVer=Vst
    if "%VerB%" == "1" set WinVer=Svn
    if "%VerB%" == "2" set WinVer=Eit
    )

    rem --- 윈도우 버전 체크 끝 ---






    rem --- 32 비트 64비트 체크 시작 ---

    if exist %windir%\SysWOW64 (
    set WinBit=64
    ) else (
    set WinBit=32
    )

    rem --- 32 비트 64비트 체크 끝 ---





    if /i "%WinVer%" == "2K" echo. & echo 윈도우 2000 - %WinBit% 비트 버전 [빌드넘버 %WinBuild%] 에서 실행 중입니다. & echo.
    if /i "%WinVer%" == "XP" echo. & echo 윈도우 XP - %WinBit% 비트 버전 [빌드넘버 %WinBuild%] 에서 실행 중입니다. & echo.
    if /i "%WinVer%" == "Vst" echo. & echo 윈도우 비스타 - %WinBit% 비트 버전 [빌드넘버 %WinBuild%] 에서 실행 중입니다. & echo.
    if /i "%WinVer%" == "Svn" echo. & echo 윈도우 7 - %WinBit% 비트 버전 [빌드넘버 %WinBuild%] 에서 실행 중입니다. & echo.
    if /i "%WinVer%" == "Eit" echo. & echo 윈도우 8 - %WinBit% 비트 버전 [빌드넘버 %WinBuild%] 에서 실행 중입니다. & echo.

    pause > nul

    exit
    • BlogIcon CApple 2013.03.14 04:18 신고  댓글주소  수정/삭제
      윈도우 PE 에서는 로컬 윈도우와는 드라이브 문자가 다른 경우가 많기 때문에 경우의 수가 많습니다. C: 가 윈도우 PE 에서는 C: 가 아닐 수도 있다는 것이죠. 그래서 생각을 좀 해야 합니다. 배치 파일은 짜보도록 하겠습니다.
    • BlogIcon CApple 2013.03.14 12:45 신고  댓글주소  수정/삭제
      http://cappleblog.co.kr/548 에 예제 배치 파일을 올렸습니다.

댓글을 달아 주세요

- 댓글에선 예의를 지켜주시기 바라며, 블로그지기는 댓글에서 따로 활동하지 않습니다.

* 티스토리 사용자는 여기를 클릭하시면 로그인 됩니다.

BBCode 안내   굵게 밑줄 기울임 취소선   취소선 취소선 취소선 취소선   왼쪽 정렬 가운데 정렬 오른쪽 정렬   코드박스 인용구 이미지   이미지 업로드-Imgur.com