CMD 명령어를 보면 이미 시스템 정보에 대해서 출력해주는 명령어가 있는대요
대표적으로 systeminfo와 dxdiag가 있겠내요
systeminfo는 CMD창에서 결과를 바로 출력해주고
dxdiag는 기본이 GUI로 창을 띄워 보여주긴하지만 옵션을 주면 파일로 저장이 가능하죠
컴퓨터 정보를 가져올 필요가 생겨서 저 두 녀석을 가지고 이리저리 배치파일을 만들어봤지만
systeminfo 같은 경우에는 설치된 OS 언어에 따라 따로 작성을 해야하는 단점이 있고..
dxdiag 같은 경우에는 영어로 저장이 되서 괜찮긴한데 제가 원하는 정보를 쏙쏙 빼오기는 너무 방대하더라구요..
그래서 찾다가 저번에 Cacti Template 만들 때 사용했던 WMI가 생각나더라구요
WMI도 처음에 배치파일 작성하다가 포기할까도 했는데 생각보다 빠르고 손 쉽게 작성이 되더라구요.
제가 필요했던 정보는
컴퓨터이름
IP주소
OS 버전(2003, 2008, 2008 R2 ...)
OS 아키텍쳐(32bit, 64bit)
OS 서비스팩 버전
OS 마지막 업데이트 날짜
물리 메모리 총 용량
CPU 갯수(물리적으로 박혀있는 갯수가 아니라 실질적으로 동작하는 프로세서 수)
HDD 파티션별 총 용량
IIS or Apache 존재 유무 및 버전
이렇게 정보가 필요했습니다.(DB관련도 필요한데 이건 아직 해결을 못했내요..)
아래 써있는 배치파일 내용을 보면 아시겠지만 주로 WMIC를 이용해서 정보를 꺼내왔고
for /f를 이용해서 원하는 값만 추려내 출력해주는 방법입니다.
for문은 CMD에 for /?라고만 쳐도 자세히 나오니 설명은 생략하겠습니다.
소스 내용 자체가 특별히 어려운 것 없이 WMIC를 이용하고 있어서 자세하게 설명은 안하겠습니다.
포스팅하면서 추가된 설명부분은 기울여놨습니다.
-------------------------------------------systeminfo_wmic.bat-------------------------------------------
@echo off
setlocal enableextensions enabledelayedexpansion
rem Language 확인
for /f "tokens=2 delims==" %%a in ('wmic os get oslanguage /format:list') do set lang=%%a
::중간에 IP주소 확인할 때 한글OS인지 아닌지 필요한데 그 때 사용하기 위해 작성
REM OS 버전 & 아키텍처
for /f "tokens=3-9 delims== " %%a in ('wmic os get caption /format:list') do set os_1=%%a&set os_2=%%b&set os_3=%%c&set os_4=%%d&set os_5=%%e&set os_6=%%f&set os_7=%%g
set osver=%os_1% %os_2% %os_3% %os_4% %os_5% %os_6% %os_7%
::변수가 쓸데없이 많이 써져있는데 이건 .. OS별로 풀네임 길이가 다른 이유로 최대치를 몇 개로 잡아야할지 몰라서 막 생성했습니다.
::좀 귀찮았던 것도 있구요
set osarch=x64
set wow64="%windir%\SysWOW64"
if not exist %wow64% set osarch=x86
::아키텍쳐 판별하는 부분인데 64비트에서만 있는 SysWOW64가 존재하는지 판별
REM HOSTNAME
set hname=%computername%
rem echo %hname%
REM IP ADDRESS
if %lang%==1042 (
IPCONFIG |FIND "IPv4 주소 . . . . . . . . . : 1" > %TEMP%\TEMP_DAT.txt
FOR /F "tokens=2 delims=:" %%a in (%TEMP%\TEMP_DAT.txt) do set IP=%%a
del %TEMP%\TEMP_DAT.txt
set IP=%IP:~1%
)
if %lang%==1033 (
IPCONFIG |FIND "IPv4 Address. . . . . . . . . . . : 1" > %TEMP%\TEMP_DAT.txt
FOR /F "tokens=2 delims=:" %%a in (%TEMP%\TEMP_DAT.txt) do set IP=%%a
del %TEMP%\TEMP_DAT.txt
set IP=!IP:~1!
)
::IP주소 구하는 부분인데.. 이 부분은 NIC가 두 개 이상이라면 꽤 수정을 해야되는 부분입니다.
::저는 필요한게 하나의 NIC에 대한 IP주소기 때문에 이렇게 작성한거구요.
::NIC 두 개 이상인 PC의 IP주소를 모두 출력하고 싶으신 분은 다르게 작성해야하지 않을까 싶습니다.
rem Memory
for /f "tokens=2 delims==" %%a in ('wmic computersystem get totalphysicalmemory /format:list') do set mem=%%a
set /a mem=%mem:~0,-4% / 1024
set /a mem=%mem% / 1024
::배치파일은 안타깝게도 큰 숫자에 대한 연산이 안됩니다.(2^31 = 2,147,483,648) 즉 2147483648보다 큰 숫자는 연산을 할 수가 없습니다.
::그래서 어차피 GB로 변환할 때 1000 으로 나누면 없어질 3자리는 미리 출력을 안하도록 하고 변환 작업을 진행합니다.
rem hdd
::for /f "tokens=2-3 delims= " %%a in ('wmic logicaldisk get filesystem^,name^,size ^| find "NTFS"') do set ::size_byte=%%b&set /a size_GB=!size_byte:~0,-3!/1048576&set label=%%a&set hdd_cap=!hdd_cap!!::label:~0,1!!size_GB!
rem hdd
for /f "tokens=2-3 delims= " %%a in ('wmic logicaldisk get filesystem^,name^,size ^| find "NTFS"') do (
set size_byte=%%b
set len=0
rem TB 인지 아닌지 검사
for /L %%i in (0,1,15) do (
set len_1=!size_byte:~%%i,1!
if "!len_1!" NEQ "" set /a len=!len!+1
if !len!==13 (set /a size_GB=!size_byte:~0,-4!/1048576&set size_GB=!size_GB!0)else (set /a size_GB=!size_byte:~0,-3!/1048576)
if !len!==14 (set /a size_GB=!size_byte:~0,-5!/1048576&set size_GB=!size_GB!00)else (set /a size_GB=!size_byte:~0,-3!/1048576)
if !len!==15 (set /a size_GB=!size_byte:~0,-6!/1048576&set size_GB=!size_GB!000)else (set /a size_GB=!size_byte:~0,-3!/1048576)
) 2>nul
set label=%%a
set hdd_cap=!hdd_cap!!label:~0,1!!size_GB!
)
::HDD 정보 구하는 부분인데... 진짜 지저분하내요.. 각 PC마다 파티션이 어떤 이름을 가지고 있을지 모르니 라벨명을 구하고
::그에 대한 용량을 구해서 메모리처럼 GB단위로 변환합니다.
::그리고 하나의 변수에 저장을 시켜버리는 과정입니다. 출력 결과는 C100D400 이런식으로 나옵니다.
::소스 부분 밑에 결과 이미지 첨부해놓을테니 참고하세요
::그리고 중간에 테라바이트인지 아닌지 확인하는 부분이 있어서 더욱 지저분해보이는데요
::원하는 출력형태에 단위를 표시하지 않기때문에 GB단위의 값이 필요해서 테라바이트가 넘어가는 숫자들은
::변환 후 뒤에 0을 더 붙여주는 식으로 100TB 까지 표현가능하게 되어있습니다.
::PB까지 필요하신분은 'rem TB인지 아닌지 검사' 밑에 for문의 15를 16으로 바꿔주시고 한 줄 더 추가하시면 되겠내요.
::아니면 아예 단위 변환하는걸 수정하셔도..
rem Service Pack Info
for /f "tokens=2 delims==" %%a in ('wmic os get servicepackmajorversion /format:list') do set sp=%%a
set sp=SP%sp%
if %sp%==SP0 set sp=N/A
rem Processor
for /f "tokens=2 delims==" %%a in ('wmic computersystem get numberoflogicalprocessors /format:list 2^>nul') do set lo_processors=%%a
if "%lo_processors%"=="" (for /f "tokens=2 delims==" %%a in ('wmic computersystem get numberofprocessors /format:list 2^>nul') do set lo_processors=%%a )
::CPU 정보인데요. if문을 사용한 이유는 첫번째 for문에 있는 wmic 명령줄은 Windows Server 2008 이후에 있는 값이기 때문에
::if를 이용해서 최초 변수에 값이 없는 경우에 2003 의 명령줄로 실행되게 해주는 부분입니다.
rem Processor Clock
for /f "tokens=2 delims==" %%a in ('wmic cpu get maxclockspeed /format:list 2^>nul') do set cpu_hz=%%a
set clock_1=%cpu_hz:~0,1%
set clock_2=%cpu_hz:~1,2%
::CPU 클럭 수치인대요 이 부분은 제가 원하는 출력형태가 x.xx 인데 최초 출력형태는 4자리 정수로 나오기 때문에
::변수를 두개 이용했습니다.
rem IIS 존재유무
set iis_exist=IIS EXIST
set iis_fd=%windir%\system32\inetsrv\InetMgr.exe
if not exist %iis_fd% set iis_exist=IIS NOT EXIST
::단순하게 작성했습니다. IIS 설치하면 생기는 inetmgr이 존재하는지 판별하게 합니다.
rem IIS 존재하면 Version 체크
if "%iis_exist%"=="IIS EXIST" (
reg query "HKLM\SOFTWARE\Microsoft\InetStp" /v "SetupString" > %TEMP%\iis_ver.txt
type %TEMP%\iis_ver.txt | find "IIS" > %TEMP%\iis_sion.txt
for /f "tokens=3-4 delims= " %%a in (%TEMP%\iis_sion.txt) do set iis_ver=%%a&set iis_sion=%%b
del %TEMP%\iis_ver.txt
del %TEMP%\iis_sion.txt
)
if "%iis_ver%" NEQ "" set iis_version=%iis_ver% %iis_sion%
::위에 IIS존재유무에서 존재한다고 판별이되면 버전검사를 합니다.
::이 부분은 WMIC에 따로 없는 듯하여 찾아보니 레지스트리에서 답을 찾게 됬고 바로 작성을 했습니다.
rem Apache 존재유무
tasklist | find "httpd" > %TEMP%\apache_exist.txt
for /f "delims=" %%a in (%TEMP%\apache_exist.txt) do set apa_che=%%a
del %TEMP%\apache_exist.txt
set apa_exist=APACHE EXIST
if "%apa_che%"=="" set apa_exist=APACHE NOT EXIST
::이 부분 역시 단순하게 실행중인 프로세스 중에 httpd가 있으면 아파치가 설치됬다고 판단합니다.
::물론 이 부분이 제일 불완전하다고 생각합니다.
rem Apache Version
if "%apa_exist%"=="APACHE EXIST" (
httpd -v | find "Apache" > %TEMP%\apa_version.txt
for /f "tokens=3 delims= " %%a in (%TEMP%\apa_version.txt) do set apa_ver=%%a
del %TEMP%\apa_version.txt
)
if "%apa_ver%" NEQ "" set apache_version=%apa_ver%
::IIS와 마찬가지로 존재한다고 판별이되면 httpd 명령을 통해 버전을 구해줍니다.
rem OS Last Update Time
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\Results\install" /v "LastSuccessTime" > %TEMP%\last_update.txt 2>nul
for /f "tokens=3 delims= " %%a in ( %TEMP%\last_update.txt) do set last_uptime=%%a
if "%last_uptime%"=="" set last_uptime=Not Update!!
del %TEMP%\last_update.txt
::이 부분도 IIS 버전 체크와 비슷하게 레지스트리를 이용합니다.
::wmic를 아무리봐도 답이 없을 것 같아 검색을 해봤더니 친절하게도 레지에 날짜가 등록되어있더군요.
echo.HOSTNAME: %hname%
echo.IP ADDRESS: %IP%
echo.OS VERSION: %osver%
echo.OS Architecture: %osarch%
echo.TOTALMEMORY: %mem%GB
echo.NUMBEROFPROCESSORS: %clock_1%.%clock_2%*%lo_processors%
echo.IIS: %iis_exist% %iis_version%
echo.APACHE: %apa_exist% %apache_version%
echo.HDD: %hdd_cap%
echo.OS LAST UPDATE TIME: %last_uptime%
:end
endlocal
pause
-------------------------------------------systeminfo_wmic.bat-------------------------------------------
단순 노동으로 작성해서 그렇게 어려운 부분은 없을 것 같내요.
이 정보들 외에 따로 필요하신 것 있으시면 wmic 명령줄만 수정하시면 되구요
그렇게 중요하고 참신한 배치파일은 아니지만 나름 공부는 되었내요 ~
마지막으로 출력결과 이미지입니다.
IP주소는 출력이안된게 아니라 지운겁니다.
' 2016년 이전 > Script' 카테고리의 다른 글
날짜 구하는 스크립트 (2) | 2014.02.05 |
---|---|
사용자 계정 생성하고 그 계정으로 작업 스케줄 등록하기 (0) | 2014.01.13 |