工場内にある2000台近くのPCの実搭載メモリの調査が必要になり、systeminfoコマンドを使って調査を開始しました。
コマンドプロンプトで、下記のコマンドを発行すれば取得できます。
C:\>systeminfo /s HostName | find “物理メモリの合計”
しかし、このコマンドを2000回も繰り返すのは嫌なので、取りあえずHostNameのリストを読み込んで上記のコマンドをループするバッチを作って実行しましたが、そのままではレポートに出来ないので、VBscriptで作ることにしました。
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("systeminfo /s " & strHostName )
Do While oExec.Status = 0
WScript.Sleep 100
Loop
WScript.echo oExec.StdOut.ReadAll
こんな感じで・・・
ところが、WshShell.Execは実行の終了を待たないので、oExec.Statusが終了を示す1になるまで待たせているのですが、なんといつまでたっても変化しません。
PowerShellのワンライナーを起動してみましたが、コマンドの戻り値が直接読めないので却下
WshShell.Exec(powershell -NoProfile -ExecutionPolicy Unrestricted -command ""& { Get-WmiObject -Class Win32_PhysicalMemory -computername "
strLine = strLine & objParm(0) & """}")
それでは、ということでVBscriptからWmiを呼び出してやることで対応しました。
Set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set oService = oLocator.ConnectServer(objParm(0))
Set oClassSet = oService.ExecQuery("Select * From Win32_ComputerSystem")
For Each oClass In oClassSet
lRet = oClass.TotalPhysicalMemory
strHost = oClass.DNSHostName
Next
まあ、こんなことせずに System Center Configuration Managerで各クライアントのハード情報のレポートを出せば良いのですが、リアルタイムでは無いと思うので、仕方ないですね
それと、systeminfoはたくさんの情報を取ってくるので時間がかかりますが、wmiでハード情報だけを取ってくると4倍高速に取得出来る様になります。
0 件のコメント:
コメントを投稿