見出し画像

5.[PG1]パワーシェルで状態監視してみよう~Debug編~

こちらは前回作成したスタートアップフォルダに入れたCMDからパワーシェルを実行するプログラムが、実は動いていなかった件についての、修正方法や、検証手順などのお勉強になります。

前回の記事は[5.[PG1]パワーシェルで状態監視してみよう]

気づき

師匠・・・。実は、状態監視のパワーシェル、あれから数日たってテキストファイル見てみたんですけど、どうも動いてないっぽいです。。。

実はこの間のプログラムがエラーになることはわかっていました。今回はデバッグをきちんとやっていきましょう!

師匠

なんと・・・。

プログラムの動作確認と、デバッグはとても大事です。
では、まずは作ったスタートアップフォルダを開いて、「morning.bat」を実行してみましょうか。

師匠

一瞬で閉じちゃうから、わからないですね・・・。あ、ちょっと赤字がでていたような・・・。

では、まずは一瞬で閉じちゃうので「pause」をbatファイルの最後の行に入れてみましょうか。

師匠

こうですかね?

powershell c:\work\pc-check\main.ps1
pause

あ、エラーが見れるようになりました!

エラーの正体

c:\work\pc-check\main.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\work\pc-check\main.ps1
を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170
) を参照してください。
発生場所 行:1 文字:1c:\work\pc-check\main.ps1
+
+ CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityExceptionFullyQualifiedErrorId : UnauthorizedAccess

「このシステムではスクリプトの実行が無効になっているため・・・」とか出ていました。セキュリティエラー?

とりあえず、なんで止まっているかのメッセージが見れるようになりましたね。では「このシステム~なっているため」くらいまでをGoogleで検索してみましょうか。

師匠

うーん。これでいいのかな? 調べたところ、設定をいじらないと実行できないって出てきました。

では、その対応をしましょうか。こういう変更については、対応前に必ず変更前の値をメモしてからやりましょう。あと、いつでも元に戻せるように設定方法を、「C:\work\pc-check」にテキストファイルで「設定変更メモ.txt」として保存しておきましょうか。

師匠

では、こんな感じでしょうか?

#確認
Get-ExecutionPolicy
#Restricted だった

#変更
Set-ExecutionPolicy RemoteSigned

#戻し
Set-ExecutionPolicy Restricted

そうですね、いいと思います。ではこれも大事なところですが、PCの大事な設定を変更するときは「管理者として実行」が必要になります。今回はパワーシェルを「管理者として実行」します。

師匠

わかりました! こんな感じですかね。

あ、変更後は「morning.bat」を実行しても赤字がでなくなりました!

では1個目のバグが治りましたね。
もうpauseを外しちゃって大丈夫だと思います。

師匠

え!? 1個目!?

2個目のデバッグ

え、どういうことでしょうか?ちゃんとテキストファイルの中身が追加で入ってるし、これで解消されてると思うのですけど?

では 1.disk.txt  を開いて、ディスク容量の確認をしてみて下さい

師匠

あれ、出てないでしょうか!? おかしいなぁ「Get-Volume」をパワーシェルで実行するとちゃんと表示されますけど、テキストファイルに出力されてない?

ちゃんと確認しないと、こういうこともあるんですよ。例えば1文字間違っていても正常に動かないし、これは大丈夫だろうと思ってもちょっとだけ違う方法で実行したらエラーになることもあるのがプログラムです。エラーというか「思う結果と違う」というか。

師匠

あとは、この前はいいませんでしたが、2番目の不明なデバイスの抽出なのですが、あのままだと正常に動いているかわからないので、あわせて確認できるようにしましょうか。
文中の「-ne」と「-eq」に変更して、実行してみましょう。
これは「エラーコードが0じゃない場合出力」って意味なのですが、
これを「エラーコードが0のものを出力」に変えることになります。
エラーコード=0は正常、0以外がエラーって意味になります。とりあえず結果がテキストファイルにどんな感じで出力されるか確認しましょう。

師匠

確かに、何も表示されないから少し不安でしたが、確かにそれだとわかりやすいですね。それにしても、「Get-Volume」はどうしてテキストファイルに書き込まれないんだろう・・・? 手動だとちゃんと書き込まれるのに・・・。あれ、「-eq」に変えたら、1番目と3番目が表示されなくなって、2番目のファイルに内容がまとめて出るようになった・・・?

うーん、これはいじわるしているわけではないのですが、私も詳しくはわからないですけど、一部のコマンドは「Start-Transcript」では出力されないみたいですね。あと2番目のファイルに内容が表示されるの、もっとわけわからないですね。プログラムは繊細ですねぇ。

師匠

詰んだってことでしょうか・・・? 最初のプログラムなのに・・・。

とりあえず、バグの場所と、原因はつかめたということで、私も一緒にデバッグしてみますね。(検索中)・・・なるほど、後ろに「 | Out-Default」をつけると「Get-Volume」もテキスト出力されるみたいです。どうやら内部的な実行形式が違うから、出力されないようです。

師匠

師匠の力を借りて、結果、以下のように修正しました!

#ディスクの残容量などの出力
Start-Transcript c:\work\pc-check\1.disk.txt -Append
Get-Volume | Out-Default
Stop-Transcript

#不明なデバイスの抽出
Start-Transcript c:\work\pc-check\2.device.txt -Append
#Get-WmiObject Win32_PnpEntity | ?{ $_.ConfigManagerErrorCode -eq 0 } | ft Caption,PNPDeviceID,ConfigManagerErrorCode -AutoSize
Get-WmiObject Win32_PnpEntity | ?{ $_.ConfigManagerErrorCode -ne 0 } | ft Caption,PNPDeviceID,ConfigManagerErrorCode -AutoSize
Stop-Transcript

#エラーとクリティカルの抽出(直近100件中)
Start-Transcript c:\work\pc-check\3.eventlog.txt -Append
Get-EventLog -LogName system -Newest 100 | Where-Object {$_.EntryType -match "Err|Critical"}
Stop-Transcript

順調に言っていると思っていましたが、一度うまくいかなくなると、ほんとプログラムが何も言うことを聞いてくれなくて、泣きそうでした・・・。

今回で、デバッグが大変だし、大事ってことと、
機能の確認は最後までやりましょう、というお話でした!

この記事が気に入ったらサポートをしてみませんか?