チョコ煮

チョコ煮

いろんな素材をチョコで煮ます

PowerShellでインベントリ情報をテキストに出力する話

最終的には、バッチファイルをダブルクリックするとPCインベントリ情報ファイルが指定したサーバのフォルダにとんでいく、ということがしたかったんですが、その遥か手前で試行錯誤しております。

 

まず、バッチファイルをダブルクリックして、PowerShellスクリプトを実行するところでつまづく。

 

可能であればPowerShellスクリプトファイルをダブルクリックかなんかすると実行してくれればいいが、そうはいかない。

仕方ないので、コマンドプロンプトからPowerShellを呼び出してスクリプトを実行してもらうという形に。バッチファイルのサンプルコードはこんなんですね。

@echo off
PowerShell -NoProfile -ExecutionPolicy Unrestricted .\hoge.ps1
pause

これだけでブログ記事1本書けるレベルの話のようですが、私は横着をしてこちらから拝借。

qiita.com

で、問題のスクリプトファイル hoge.ps1 ですが、ここにはファイルに出力するインベントリ情報を取得するコードを書かないといけません。

しかし調べたところ、コマンドをビシバシ書いた複数行の文字列をファイルに出力してくれるというのは意外とない様子。 絶対需要あると思うんですが、そういう疑問を抱くこと自体初心者のなせる業なのでしょうか。

それでも2つの方法を見つけました。

最初はこちら。 Start-TranscriptとStop-Transcriptでログをとってしまおうという手法。

Start-Transcript .\fugafuga.txt

"テストほげ"

Stop-Transcript

バッチと組み合わせた実行結果はこんな感じ(一部伏字)。

**********************
Windows PowerShell トランスクリプト開始
開始時刻: 20180329214854
ユーザー名: PC\choco
RunAs ユーザー: PC\choco
構成名: 
コンピューター: PC (Microsoft Windows NT 10.0.*****.0)
ホスト アプリケーション: PowerShell -NoProfile -ExecutionPolicy Unrestricted .\hoge.ps1
プロセス ID: *****
PSVersion: *******
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.*****.***
BuildVersion: 10.0.*****.***
CLRVersion: 4.0.*****.*****
WSManStackVersion: *.*
PSRemotingProtocolVersion: *.*
SerializationVersion: *.*.*.*
**********************
トランスクリプトが開始されました。出力ファイル: .\fugafuga.txt
テストほげ
**********************
Windows PowerShell トランスクリプト終了
終了時刻: 20180329214854
**********************

うーん、盛大にヘッダとフッタがついてて本文が思いっきり負けてる。

これでは情報過多なので、別の方法を探しました。するとヒアドキュメントを使ってやればいいじゃないという記事がありました。こちら。

ヒアドキュメントを使って複数行を 1 つの文字列にする[PowerShell] : バヤシタ

結局ヒアストリングを変数で取り込んで、Out-Fileコマンドレットかなんかでファイル出力すればいいじゃないという結論に。 イメージはこんな感じ。

$computer = "."

$os = Get-WmiObject -Class Win32_hogehoge -Computer $computer
  $osname = $os.name
  $osver = $os.version
  $username = $os.username

$network = Get-WmiObject  -Class Win32_pekepeke -Computer $computer -Filter IPEnabled=TRUE
  $NICname = $network.nicname
  $ip = $network.ipaddress
  $mac = $network.macaddress

##ここから書くよ##
$output = @"
OS名 :       $osname
OSVer. :     $osver
ユーザ名 :    $username
NIC名 :       $NICname
IPアドレス :  $ip
MACアドレス : $mac
"@
##ここまで書いた##

$output | Out-File .\fugafuga.txt 

うーん、一応目的は達してるけど、他にやりようがあるようでモヤっとしますね。

上記サンプルコードは適当に描いたものなのでそのままでは動きません。あしからず。

UNC名でファイルパスを書けばサーバにはとんでくれるので、あともう一息というところでしょうか。