1. nijinagome

    Posted

    nijinagome
Changes in title
+非推奨であるwmicコマンドの代替を探す(Get-WmiObject)
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,87 @@
+# wmicは非推奨です
+
+`wmic`は、Windowsのいろんな情報を引けるWMI(Windows Management Instrumentation)を扱うコマンド。
+いまこれのヘルプを引くと「非推奨です」と表示される。
+
+```console:cmd
+>wmic /?
+
+WMIC は非推奨です。
+```
+
+[公式ドキュメント](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/wmic)には記述が見当たらないが、情報によると2012年Windows8から非推奨扱いになったんだそうで。いまも実際に非推奨と表示される以上非推奨なんだろう…
+
+変わりなく動くのでそのまま使っているものの、非推奨だよと明記されてるものをいつまでも使い続けるのは気分が悪い。
+代替か後継があるんだろうな~ってことで、PowerShellコマンドレットを探す。
+
+# 引きたい情報の具体例
+
+主にプリンタ情報を取得するのに使っていたので、それを例にする。
+下のように一覧表示して目星をつけて、ポート疎通確認したりステータス調べたりする。
+
+```console:cmd
+# プリンタ情報を取得する
+# 実際はnodeを取得したい先のホスト名にする
+wmic /node:"localhost" printer get Name,Default,Status,PortName
+```
+
+```console:出力
+Default Name PortName Status
+FALSE Microsoft Print to PDF PORTPROMPT: Unknown
+FALSE Fax SHRFAX: Unknown
+TRUE DocumentPrinter 192.0.2.71 Unknown
+```
+
+# Get-WmiObjectコマンドレット
+
+[Get-WmiObject](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-wmiobject?view=powershell-5.1)
+`Get-WmiObject`という、いかにもWMI取り扱いですよという名前のコマンドレットがある。これで`Win32_Printer`クラスを呼んでやれば求める結果が返ってくる。パラメータ指定もおおむね似通った感じで書けて、結果も似たようなものになる。
+出力をどうこうしたい場合もPowerShellのほうが扱いやすい。
+
+```powershell:PowerShell
+Get-WmiObject -Class Win32_Printer -ComputerName "localhost" | select Default,Name,Portname,Status
+```
+
+```powershell:出力
+Default Name Portname Status
+------- ---- -------- ------
+ False Microsoft Print to PDF PORTPROMPT: Unknown
+ False Fax SHRFAX: Unknown
+ True DocumentPrinter 192.0.2.71 Unknown
+```
+
+代替としてはこれでいいだろう。
+他に得たいプロパティがあれば、`select *`で表示して必要なものを探すこと。86個も出てきてそんなにいらねえよってなった。
+
+
+## Computer System Hardware Classes
+
+`Get-WmiObject`を使って、他にも様々な情報を読み出せる。
+多すぎて一覧は無理なので、欲しいものがあったら公式で探すといい。
+[Computer System Hardware Classes](https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/computer-system-hardware-classes)
+
+
+# Get-Printerコマンドレット?
+
+[Get-Printer](https://docs.microsoft.com/en-us/powershell/module/printmanagement/get-printer?view=win10-ps)
+Get-Printerという、これまたいかにもプリンタ取り扱いですよという名前のコマンドレットもある。
+こちらは得られる情報の種類が異なっている。例えば`Default`プロパティと`Status`プロパティは同じ名前では存在しないようで、出てこない。
+`ComputerName`パラメータをlocalhostにすると返事がやたら遅かったり、なんか挙動不審。(hostnameを明記すれば早い)
+
+```powershell
+Get-Printer -ComputerName "hostname" | select Default,Name,Portname,Status
+```
+
+```powershell:出力
+Default Name Portname Status
+------- ---- -------- ------
+ Microsoft Print to PDF PORTPROMPT:
+ Fax SHRFAX:
+ DocumentPrinter 192.0.2.71
+```
+
+`select *`で調べてみると`Get-WmiObject Win32_Printer`とはだいぶ違うプロパティを持っている。`CimInstanceProperties`プロパティの中にあれこれ情報が埋まっているようだ。(例示は省略)
+こちらは`wmic`の代替の意味では扱いづらい。もっと別な使い方のために用意されたコマンドレットなんだろう。たぶん。
+
+
+