見出し画像

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

こちら第5回「プログラマー養成講座」になります!
目次はこちらからご参照下さい!

今回から、いよいよ「プログラム言語」を覚えていきます。これから5個のステップを元に、5種類のプログラム言語を使っていきます。今回は、私「ひさき」がWindows10を使っていて、Office365をPCにインストールしていることから、以下の5つにして頂いたようです。
1つ目は、WindowsOSに実装されている「パワーシェル」
2つ目は、MicrosoftのOffice365の「Excel VBA」
3つ目は、同じくOffice365の「Access VBA」
4つ目は、WEBページを作る言語の1つ「PHP」
5つ目は、DB操作を行う「SQL」

というわけで、1つ目の「パワーシェル」について、これから講座を進めていきます。

パワーシェルとは?

GUI

皆さんが使っているパソコンは、
マウスでカーソルを移動して、ダブルクリックして実行します。
このような目で見てわかりやすいような画面操作のことを、
GUI、グラフィカル ユーザー インターフェイスといいます。

CUI

反対にCUI、キャラクターユーザーインターフェースというものがあります。(キャラクターとは、人物のことではなく、文字という意味です。)
これはパソコンの操作をマウスクリックではなく、文字で会話するように実行することを意味しています。

OSコマンド/コマンド

CUIで入力してパソコンを操作する文字のことを「OSコマンド」や、たんに「コマンド」といったりします。皆さんがフォルダをクリックしたり、ファイルをクリックすると、裏側ではパソコンが「コマンド」を実行した結果を画面に表示しています。「コマンド」は「プログラム言語」の中では「スクリプト言語」に分類されます。

パワーシェルとコマンドプロンプト

そしてWindows10ではCUIが2種類あり、それが「パワーシェル」と「コマンドプロンプト」です。違いは「コマンドプロンプト」は昔からあるコマンドで、「パワーシェル」はWindows10から登場したコマンドです。将来的には「コマンドプロンプト」はなくなり、「パワーシェル」だけになるかもしれません。

実際にコマンドを使ってみよう

ではさっそく、以下の作業をやってみましょう

  1. パワーシェルを起動しよう

  2. 作業フォルダを作ろう

  3. 作業フォルダへ移動しよう

  4. テキストファイルを作ろう

  5. 作業フォルダ内のファイル一覧を確認しよう

  6. メモ帳(プログラムファイル)で開き、「あ」と入力し保存して終了しよう

  7. テキストファイルのサイズを確認しよう

今から上記の作業をCUIでコマンドを書くことで実施していきます。

  1. パワーシェルを起動しよう

    • Windowsキー + Rキーを押して「ファイル名を指定して実行」起動

    • 「powershell」と入力して、エンターキーを押す

    • 問題なければ「Windows PowerShell」というウィンドウが開きます

  2. 作業フォルダを作ろう

    • 作業フォルダは、Cドライブにworkの下にpsを作成しましょう

    • 「New-Item -Path 'C:\work\ps' -ItemType Directory」

    • workフォルダがない場合、workフォルダもできます

  3. 作業フォルダへ移動しよう

    • 最初は自動的にマイドキュメントのあるフォルダにいます

    • 「Set-Location -Path 'C:\work\ps'」

  4. テキストファイルを作ろう(5と一緒にやります)

  5. 作業フォルダ内のファイル一覧を確認しよう

    • 4と5は同時にやります。

    • まず、テキストファイルを作る前に「ファイル一覧」を実行し、

    • テキストファイルを作成後にも「ファイル一覧」を実行して違いを確認しましょう

    • 「Get-ChildItem」で、ファイル一覧が表示されますが、何もないので何も表示されないはずです

    • 「New-Item -Path 'text.txt' -ItemType File」でファイルを作成します。現在いるフォルダに「text.txt」のテキストファイルを作ります

    • もう一度「Get-ChildItem」して、表示される内容を確認しましょう

  6. メモ帳(プログラムファイル)で開き「あ」と入力し保存して終了しよう

    • 「メモ帳」は正式には「notepad.exe」といいます。プログラムを実行するときには、半角スペースをあけて文字を渡すことができます。これを「引数」「オプション」といいます。今回はファイル名を第一引数に指定してあげます。

    • 「notepad.exe text.txt」

    • メモ帳が起動して、何も表示されない状態になると思います

    • 「あ」と入力して閉じましょう

  7. テキストファイルのサイズを確認しよう

    1. 「Get-ChildItem」を実行すると、さきほどとちょっとだけ内容が変わります。Lengthというところが「2」か「3」になっていると思います。

ひとまず、パワーシェルというものをさわってもらいました。今はまだフォルダ作って、テキストファイルを作って、メモ帳で編集しただけですが、今までGUIでやっていたことを、CUIでやったということを覚えておいて下さい。

これだけだと、まだ「実践的なプログラム」とは言えないので、今日はもう一歩進んでいきます。実は「OSコマンド」は、パソコン内のOSが司る部分の情報処理が、他のプログラムに比べると簡単にできることが特徴です。
なので今日は「自分のPCの状態を、テキストファイルに出力するプログラムをOSコマンドで作る」をやります。

パソコンの状態出力プログラム仕様

さて、プログラムを作成する際には、設計書を作ります。そんなに固いものではなく「どんなプログラムにしようか」を決めるためのドキュメント(書類)です。今回の仕様はこんな感じにしようかと思います。


・以下の3項目を、それぞれのテキストファイルに出力する
 1.ディスクの残容量/状態
 2.不明なデバイスがあるか     
 3.イベントログの種類が「重大/エラー」のログを出力

・出力するファイルについては、以下の通りとする
 c:\work\pc-check
    \1.disk.txt
    \2.device.txt
    \3.eventlog.txt

・プログラムファイルは以下に作成する
 c:\work\pc-check\main.ps1

・パソコン起動時に実行する


仕様としては、上記の通りです。プログラムやシステム設計するには「書いてある事実」以外の目的を考えるのも重要です。例えば、今回のプログラムは、出力後のテキストファイルは情報を「1.disk.txt」へ追加書込みしていくと、あとで「いつ残容量が増えたのか」が確認出来るようにするので、実行日付なども付属情報として出力したほうが良いでしょう。プログラムを作る「目的」を考えていれば、仕様に書いてなくても「これって必要なのでは?」と確認することにも頭が回るようになります。仕様書を書いている人も基本はシステムエンジニアですが、大筋を考えていると、細かいことを見逃すこともままありますので、ここに気を使えるようになると「できる」社会人な感じがしますね。

では、目標30分で作成してみて下さい!よーい、ドンっ!!!

ひさき実践編

ここまで「ふんふん、なるほど」「お、できました、表示されました!」と話していた、ひさき。いきなりの「よーいドン」ではじめてのプログラムがはじまる!

なるほど、実践的とはこういうことかぁ・・・。与えられたのは「パワーシェルには、特定の文字=コマンドを与えると、結果を表示してくれる」ということだけ。まずは、コマンドを調べないとどうすることもできない、のかな。

そうですね。プログラム言語は、そう、言語なんです。コマンドを調べるのは「英単語」を調べているようなもの。英単語を調べるのに「本」や「辞書」を使う人もいれば、インターネット検索する人もいます。今回は事前に準備できていないのでインターネット検索になりますが、最初に覚えるプログラム言語が定まったら「本」「辞書」を手元に持っておいた方が良いですね。前にも少し話しましたが、インターネット情報は、最新のものもHITしますが、嘘情報もHITします。その嘘か本当かがまだ判定できないうちは、本を見ることは安全に学習を進められるのでお勧めです。

師匠

なるほど、そこは「考える」とかじゃなくて「英単語の辞書をひく」ように調べるしかないのか。検索しましょう!「ディスクの状態」で検索。「CrystalDiskInfo」?まずはこれをインストールすればいいのかな?でもこれはツールのインストールしたら、パワーシェルになるの?わからない・・・。

検索するときは、コンピューター言語+やりたいこと で調べると良いですよ

師匠

ああ、確かに!「パワーシェル ディスクの状態」で検索します!

そして、10分くらい調べて、以下の3つのコマンドまで調べました。

1.ディスクの残容量/状態

Get-Volume

2.不明なデバイスがあるか

Get-WmiObject Win32_PnpEntity | ?{ $_.ConfigManagerErrorCode -ne 0 } | ft Caption,PNPDeviceID,ConfigManagerErrorCode -AutoSize

3.イベントログの種類が「重大/エラー」のログを出力

Get-EventLog -LogName system -Newest 100 | Where-Object {$_.EntryType -match "Err|Warn"}

こんな感じなのだろうか。3がめちゃくちゃ出力されたけど、とりあえず置いといて・・・。あとはテキストファイルに出力?する方法を調べよう。「パワーシェル テキスト出力」で検索。

テキスト出力

Start-Transcript c:\work\pc-check\1.disk.txt
~~~
Stop-Transcript

試しに1.disk.txtを作ってみるか・
・・・すごい、できた! しかも「開始時刻」とかも書いてある!たしか日付とかも出力するように言われてたから、それもクリアかな!?

あとは「パワーシェル パソコン起動時に実行する」で検索して、と。

なるほど、とりあえず「$profile」を実行してと。出力されたパス?フォルダのことかな? エラーになっていけないからフォルダがないから作らないといけない? ファイルも作成するのかな?Microsoft.PowerShell_profile.ps1って書いてあるけど、そこに「Get-Volume」とか書くのかな?あれ、パワーシェルを開くときに、赤い文字で「セキュリティ エラー」って出るようになった。これは、壊してしまったの?し、師匠、ギブアップです・・・

参照してる文の最後の方に「PowerShell起動時に読み込まれるスクリプトとなります」って書いてあるから、パソコン起動時じゃなくてPowerShell起動時の設定をしてますね。そして作成したフォルダもファイルも消しておきましょうね。そうすれば「セキュリティ エラー」って出なくなりますよ

師匠

あぁぁぁぁ、日本語の時点で見落としていた・・・

でも、その検索ワードは、悪くないですよ。上から4番目くらいの「PC起動時に定型業務を自動化する方法」を参考にすると良かったのだと思います。そこのサイトは「1.バッチファイルを作成する」「2.PC起動時にバッチファイルを動くようにする」と、最低限の作業でパソコン起動時の設定を説明されていますね。

師匠

師匠は、それを、見てすぐ「この英単語が正解」みたいなことがわかるんですか?ひさきには、わからなかったです。

最初は難しいかもしれませんね。「パソコンにやらせたい仕事」をより具体的に理解していくと、どれが正解で、どれは違うことを言ってるとかが、わかるようになりますよ。

師匠

では、そのサイトを読んでやってみます。

それから15分後(計40分くらい)・・・

最終的にはこうなりました。Windowsキー+Rキー押してでたところに「shell:startup」を入力してエンターを押すとスタートアップフォルダが起動して、そこにファイルやショートカットを入れるとログイン時に実行されるそうです。そこに「morning.bat」を作成し、

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

と書きました。これは仕様書に書いてあったので「main.ps1」を作りました。こんな感じです!どうですか!できましたよ、師匠!仕様通りでしょう!

Start-Transcript c:\work\pc-check\1.disk.txt
Get-Volume
Stop-Transcript
Start-Transcript c:\work\pc-check\2.device.txt
Get-WmiObject Win32_PnpEntity | ?{ $_.ConfigManagerErrorCode -ne 0 } | ft Caption,PNPDeviceID,ConfigManagerErrorCode -AutoSize
Stop-Transcript
Start-Transcript c:\work\pc-check\3.eventlog.txt
Get-EventLog -LogName system -Newest 100 | Where-Object {$_.EntryType -match "Err|Warn"}
Stop-Transcript

では、採点しますね!。今回は初回ですし、0スタートで頑張ってましたね。お疲れさまでした。

△以下の3項目を、それぞれのテキストファイルに出力する
〇出力するファイルについては、以下の通りとする
〇プログラムファイルは以下に作成する
〇パソコン起動時に実行する

よって80点ですかね!
初回としては合格点だと思います!お疲れ様でした!

師匠

80点は嬉しいですけど、ぼくのどこが駄目っていうんですか!

まず、テキスト出力は「追加書込み」が必要なのですよ。
これはちゃんとその意味も、ちゃんと説明しています。
Start-Transcript c:\work\pc-check\1.disk.txt
だけだと、常に「上書き」処理になっています。
Start-Transcript c:\work\pc-check\1.disk.txt -Append
として「-Append」を加える必要がありました。
この説明/記述の仕方は、ひさきさんが参照したWEBサイトにも例文がのっていました。

もう一つ、
Get-EventLog -LogName system -Newest 100 | Where-Object {$_.EntryType -match "Err|Warn"}
ですが、これはあまり内容を理解しないでコピペしただけですね。
ですが仕様で指定されていない部分は今回は間違いにはしません。仕様に書いてあるのは「重大/エラー」の出力です。これに該当するのは「match "Err|Warn"」の部分で、「エラーもしくは警告」を出力するようなコマンドになっています。それを調べるには「Get-EventLog 重大」などで検索すると良かったですね。そこだけ直せば実践的なコマンドにはなるかと思います。

ちなみに「 -Newest 100」の意味を理解されていないと思いますが、これは直近100件の出力をする、という意味ですので、この条件のせいでチェック漏れが発生する可能性があります。1回のPC起動時に、平均3000個のログが出る場合、最後の100件分しかチェックしないということですから。でも、これは指定の方法が難しいので、直近100でひとまず大丈夫です。

師匠

はい、このまま実装されていたとしたら、1も2も3も、その日の状態しかでてないので、台無しだったあげく、3はそもそも確認不足の嵐で機能していなかったのですね・・・
80点も下さり、ありがとうございました・・・

いえいえ、最初から頑張っていたと思いますよ。プログラムの目的は達成していないかもしれませんが、これは「プログラムを覚える」ことが目的の講義なので、その観点で80点です!
このプログラムはこのまま稼働させておいて、講義が終わった時に、一緒に内容を見ましょうね。

師匠

コメントアウト

そして師匠に直してもらったものがコチラ。行頭に「#」をいれると、コメントアウトという機能が適用され、プログラムで認識されない文字を記載することができるそうです。プログラムとしては意味がないものになりますが、3か月後、半年後にこのプログラムを開いたときに、どこに何をプログラムしているかがわかるように、コメントアウトを書いておくのが良いらしいです。あと、処理がひと段落したら「改行」を入れた方が良いということです。これもプログラムの実行には意味がないことですが、プログラムを修正するときに「まとまりで、1処理」みたいにぱっと見でわかると良いプログラムといえるそうです。

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

#不明なデバイスの抽出
Start-Transcript c:\work\pc-check\2.device.txt -Append
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

次の講義は、Excelで作るプログラム?になります!
題名みてるだけで、ちょっと便利そう!
6.[PG2]Excelで、ファイル一覧作成し、ファイル名変更してみよう
今回の講義はこれで終了です!

最後に注意事項!

今回、ちょっと危ないかもなと思う場面もありつつ、最初のお題に成功しましたが、最後にちょっとだけ注意事項を話しておきます。

<インターネット上のサンプルプログラムを、そのまま実行しないこと>「OSコマンド」は便利なのですが、通常ユーザーがやらないコマンドも、実行することができてしまいます。最悪の場合、本当にパソコンが壊れてしまいます

例えば
・OSの入ったディスクを全削除
 →OSがなくなり、つまりパソコンが起動しなくなります

・ネットワークアダプタのドライバを無効化
 →インターネットができなくなります

・日本語で表示されている画面を、タイ語などに変えられた
 →タイ語がわからなければ、操作がろくにできなくなります

・画面の背景色を白にして、文字色も白にされる
 →実質、文字が消されたようなもので、操作がろくにできなくなります

インターネット上に書いてあるコマンドを何も考えずに実行することは、それらの危険なコマンドを実行する可能性もあることを覚えておいて下さい。

そうならないためには、コマンドの内容が全部わからなくても、理解するように努力をして下さい。次に優先される防衛策は、「書籍」を買ってプログラムを勉強するとか「信頼できるWEBサイトを見つける」ことだと思います。

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