最終的には、バッチファイルをダブルクリックするとPCインベントリ情報ファイルが指定したサーバのフォルダにとんでいく、ということがしたかったんですが、その遥か手前で試行錯誤しております。
まず、バッチファイルをダブルクリックして、PowerShellスクリプトを実行するところでつまづく。
可能であればPowerShellスクリプトファイルをダブルクリックかなんかすると実行してくれればいいが、そうはいかない。
仕方ないので、コマンドプロンプトからPowerShellを呼び出してスクリプトを実行してもらうという形に。バッチファイルのサンプルコードはこんなんですね。
@echo off PowerShell -NoProfile -ExecutionPolicy Unrestricted .\hoge.ps1 pause
これだけでブログ記事1本書けるレベルの話のようですが、私は横着をしてこちらから拝借。
で、問題のスクリプトファイル 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名でファイルパスを書けばサーバにはとんでくれるので、あともう一息というところでしょうか。