読者です 読者をやめる 読者になる 読者になる

name_untitledのエッセイ

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

PCの情報を一通り取得するバッチ(VBS含む)を作成中。

友人の依頼で、PCの情報を一気に取得できるバッチを作成中。

追記:HDDとメモリの情報も取得できるよう修正。

本当はリモートでとれるといいのだけど、systeminfoコマンドだけだと欲しい情報が足りないみたいだし、PCとログイン名のリストファイルを作るのもメンドクサイからPCを立ち上げてUSBを差してバッチを実行する想定で組んでみた。

ちなみに英語やその他言語OSの場合は、sysyteminfoとかで検索のキーにする文字列を変更すると多分同じように動く。

 

作った(パクった)のは35ファイル

main.bat

cd /d %~dp0

setlocal enabledelayedexpansion

for /F "tokens=1-2* delims=: " %%a in ('systeminfo ^| findstr /r /c:"^OS" /c:"^システム" /c:"^ホスト" /c:"^プロダクト"') do (

echo %%a %%b | find "ホスト名" > nul
if !errorlevel! equ 0 (
set HOST_NAME=%%b
)
echo %%a %%b | find "システム製造元" > nul
if !errorlevel! equ 0 (
echo %%b |findstr \%\%b
if not !errorlevel! equ 0 set MANUFACTURER=%%b

echo %%c |findstr \%\%c
if not !errorlevel! equ 0 set MANUFACTURER=%%b %%c

echo %%d |findstr \%\%d
if !errorlevel! equ 0 set MANUFACTURER=%%b %%c %%d

echo %%e |findstr \%\%e
if !errorlevel! equ 0 set MANUFACTURER=%%b %%c %%d %%e

echo %%f |findstr \%\%f
if !errorlevel! equ 0 set MANUFACTURER=%%b %%c %%d %%e %%f

echo %%g |findstr \%\%g
if !errorlevel! equ 0 set MANUFACTURER=%%b %%c %%d %%e %%f %%g
)
echo %%a %%b | find "システム モデル" > nul
if !errorlevel! equ 0 (
set SYSTEM_MODEL=%%c
)

echo %%a %%b | find "OS 名" > nul
if !errorlevel! equ 0 (
set OS_NAME=%%c
)

echo %%a %%b | find "システムの種類" > nul
if !errorlevel! equ 0 (
set PC_BIT=%%b %%c
)

echo %%a %%b | find "プロダクト ID" > nul
if !errorlevel! equ 0 (
set OS_SERIAL=%%c
)

)

rem serial number
for /f "skip=1 usebackq tokens=* " %%a in (`wmic bios get serialnumber`) do (
SET SERIAL_NUMBER=%%a
GOTO endFor
)
:endFor

rem cpu
for /f "usebackq tokens=* delims=" %%D in (`call cscript //nologo cpu.vbs`) do SET cpu=%%D
echo CPU = %cpu%

rem memory
for /f "usebackq tokens=* delims=" %%D in (`call cscript //nologo memory.vbs`) do SET memory=%%D
echo memory = %memory%

rem hdd
for /f "usebackq tokens=* delims=" %%D in (`call cscript //nologo HDD.vbs`) do SET hdd=%%D
echo hdd = %hdd%


rem soft情報
call cscript //nologo softList.vbs
for /f "tokens=1,2 delims= " %%i in ('findstr /r /c:"^ESET" /c:"^Kaspersky" /c:"^Microsoft Office" prog.txt') do (
echo %%i %%j | find "ESET" > nul
if !errorlevel! equ 0 (
SET ANTI_NAME=%%i
SET ANTI_VERSION=%%j
)
echo %%i %%j | find "Microsoft Office Professional" > nul
if !errorlevel! equ 0 (
SET OFFICE_VERSION=%%i
)
echo %%i %%j | find "Microsoft Office Enterprise" > nul
if !errorlevel! equ 0 (
SET OFFICE_VERSION=%%i
)

)

rem 最後にCSVを出力しておしまい。
echo %HOST_NAME%,%MANUFACTURER%,%SYSTEM_MODEL%,%SERIAL_NUMBER%,%OS_NAME%,%PC_BIT%,%OS_SERIAL%,%cpu%,%memory%,%hdd%,%OFFICE_VERSION%,%ANTI_NAME%,%ANTI_VERSION% >> test.txt
pause

 

cpu.vbs (下のサイトのマルコピです)

Option Explicit

Dim oClassSet, oClass, oLocator, oService
Dim szMsg
Dim cpu: cpu = "hogehoge"

Set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set oService = oLocator.ConnectServer
Set oClassSet = oService.ExecQuery("SELECT * FROM Win32_Processor")


For Each oClass In oClassSet
cpu = oClass.Name
Next
Set oClassSet = Nothing
Set oClass = Nothing
Set oService = Nothing
Set oLocator = Nothing
WScript.Echo cpu
Set cpu = Nothing

 

softList.vbs(これもマルコピです。)

rem http://blog.userside.co.jp/vbscript%E3%81%A7%E4%BD%9C%E3%82%8B%E3%80%8C%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9F%E3%80%8D%E3%83%84%E3%83%BC%E3%83%AB/
Dim arrRegMKey(3)
Dim arrRegHKey(3)
Dim arrRegSKey(3)
Set objShells = WScript.CreateObject("WScript.Shell")
Set objFsystm = WScript.CreateObject("Scripting.FileSystemObject")
Set objLocatr = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objServce = objLocatr.ConnectServer
Set objRegKey=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

'保存ファイル名を指定します(ここではデスクトップ上にprog.txtというファイルで保存します)
'Set objPrgfil = objFsystm.OpenTextFile(objShells.SpecialFolders("Desktop") & "\prog.txt",2,True)
Set objPrgfil = objFsystm.OpenTextFile(objShells.CurrentDirectory & "\prog.txt",2,True)

'レジストリサブキー取得(win32/64)
arrRegMKey(0)="HKEY_LOCAL_MACHINE"
arrRegHKey(0)=&H80000002
arrRegSKey(0)="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
'レジストリサブキー取得(win64の32bitアプリ)
arrRegMKey(1)="HKEY_LOCAL_MACHINE"
arrRegHKey(1)=&H80000002
arrRegSKey(1)="SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
'レジストリサブキー取得(win32/64)
arrRegMKey(2)="HKEY_CURRENT_USER"
arrRegHKey(2)=&H80000001
arrRegSKey(2)="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
'レジストリサブキー取得(win64の32bitアプリ)
arrRegMKey(3)="HKEY_CURRENT_USER"
arrRegHKey(3)=&H80000001
arrRegSKey(3)="SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"

'レジストリ検索用にエラー表示を行わない
On Error Resume Next

For intRegRed = 0 to UBound(arrRegMKey)
objRegKey.EnumKey arrRegHKey(intRegRed) , arrRegSKey(intRegRed) , arrSubKey1
'レジストリサブキー検出
For Each strSubKey0 In arrSubKey1
strAppNam = ""
strAppVer = ""
strAppVem = ""
strAppInd = ""
strAppSyc = ""
strAppPid = ""
strAppNam = Replace(objShells.RegRead(arrRegMKey(intRegRed) & "\" & arrRegSKey(intRegRed) & "\" & strSubKey0 & "\DisplayName") ,",",".")
strAppNam = Replace(strAppNam , VbCrLf ,".")
strAppNam = Replace(strAppNam , VbTab ,".")
strAppVer = Replace(objShells.RegRead(arrRegMKey(intRegRed) & "\" & arrRegSKey(intRegRed) & "\" & strSubKey0 & "\DisplayVersion") ,",",".")
strAppVem = Replace(objShells.RegRead(arrRegMKey(intRegRed) & "\" & arrRegSKey(intRegRed) & "\" & strSubKey0 & "\Publisher") ,",",".")
strAppInd = Replace(objShells.RegRead(arrRegMKey(intRegRed) & "\" & arrRegSKey(intRegRed) & "\" & strSubKey0 & "\InstallDate"),"/","")
strAppSyc = objShells.RegRead(arrRegMKey(intRegRed) & "\" & arrRegSKey(intRegRed) & "\" & strSubKey0 & "\SystemComponent")
strAppPid = objShells.RegRead(arrRegMKey(intRegRed) & "\" & arrRegSKey(intRegRed) & "\" & strSubKey0 & "\ProductID")

'ソフトウエア名が空白でSystemComponentキーが"1"ならば書き込まない
If strAppNam <> "" And strAppSyc <> "1" Then
'strAppCsv = strAppCsv & strAppNam & VbTab & strAppVer '& VbTab & strAppInd & VbTab & strAppVem & VbTab & strAppPid & VbTab & strSubkey0 & VbCrLf
strAppCsv = strAppCsv & strAppNam & VbTab & strAppVer & VbCrLf
End If
Next
Next

On Error Goto 0

'データ書き込み
objPrgfil.Write strAppCsv

'終了処理します
objPrgfil.close
Set objShells = Nothing
Set objFsystm = Nothing
Set objLocatr = Nothing
Set objServce = Nothing
Set objPrgfil = Nothing

 

HDD.vbs

  On error resume next
Err.Clear
Dim objWMIService
Dim objLogicalDisk
Dim colLogicalDisks
Dim strRet
Dim DiskSize
Dim DiskFreeSpace
strRet=""
DiskSize = 0
DiskFreeSpace = 0

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colLogicalDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk where DriveType=3")

For Each objLogicalDisk in colLogicalDisks
DiskSize = objLogicalDisk.Size
IF DiskSize > 0 Then
DiskSize = ROUND(DiskSize/(1024*1024*1024),1) & "GB"
Else
DiskSize = "N/A"
End IF

DiskFreeSpace = objLogicalDisk.FreeSpace
IF DiskFreeSpace > 0 Then
DiskFreeSpace = ROUND(DiskFreeSpace/(1024*1024),0)
IF DiskFreeSpace < 1024 Then
DiskFreeSpace = DiskFreeSpace & "MB"
Else
DiskFreeSpace = ROUND(objLogicalDisk.FreeSpace/(1024*1024*1024),1) & "GB"
End IF
Else
DiskFreeSpace = "N/A"
End IF
strRet = DiskSize
Next
IF strRet <> "" Then
'strRet = Mid(strRet,1,Len(strRet)-2)
End IF
WScript.Echo strRet
Err.Clear

 

memory.vbs

On error resume next
Err.Clear
Dim objWMIService
Dim objComputer
Dim colComputers
Dim strRet

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colComputers = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
For Each objComputer in colComputers
strRet = objComputer.TotalPhysicalMemory
Next
IF strRet ="" Or strRet = 0 Then
strRet = "N/A"
Else
'小数点以下を四捨五入しGBに変換
strRet = ROUND(strRet/(1024*1024*1024),0) & "GB"
End IF
WScript.Echo strRet

 

上記を同じフォルダに入れて、main.batをクリックすると追加書きされてきます。メーカー名のところがまだ手直し中。

→修正しました。メーカー名が5単語までなら表示されるはず。変数を出力した際に存在しない変数名の場合、変数名がそのまま出力されるので、その変数名で検索をかけて文字列内に存在していれば変数が定義されていない、見つからなければ定義されているというロジックでメーカー名を組み立てた。

こんな感じで出ます。

マシン名,Panasonic Corporation %d %e %f %g,XX-XXXXX,XXXXXX,Microsoft Windows 8.1 Pro,x64-based PC,99999-999999-99999-XXXXX,Intel(R) Core(TM) i5-3340M CPU @ 2.70GHz,Microsoft Office Professional Plus 2010,ESET Smart Security,8.0.319.0

 

まず、大まかな情報、マシン名、OSバージョン、製造元、モデル名はsysteminfoでとれる。英語OSでもとれるみたい、、、。

www.atmarkit.co.jp

シリアルIDはwmic bios get serialnumberのコマンドでとれるみたいだが、どのメーカーでも取れるのか気になってる。ありがとうございました。

orebibou.com

インストールされているソフトはこんな感じでファイルに出力できる。これはVBS。ほんとに助かりました。ありがとうございます。

VBScriptで作る「ちょっとした」ツール | UserSide Staff Blog

 

これはそのうち要りそうだからUP

blogs.yahoo.co.jp

 

バッチファイルからVBSはこう呼ぶ。call

tsg21.com

 

このサイトがかなりこぎれいに処理を書いてて参考になりました。これもほとんどそのまま使わせていただきました。ありがとうございました。

現場で使える VBScript 25選 | アプリ仮想化奉行

 

 

 

forのオプションとかで結構はまった。

ちゃんとオプションを分かって指定しないとドツボにはまる。

FOR /F その1 = FOR文でファイルを1行ずつ取り出して実行する方法 - Windowsのコマンドプロンプト(bat,cmd) - to_dk notebook

 

あと、変数への値のセットで=の前後に半角スペースを入れていて全然値が入らないのも結構はまった。