支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • PowerShellを使おう~実際の

はじめに

業務でコマンドプロンプトやLinuxを使ってスクリプトを作成されたことがある方は多いかと思います。私は業務でコマンドプロンプトを頻繁に使用していたのですが、PowerShellに関してはあまり利用する機会がありませんでした。コマンドプロンプトではやはり出来ないことが多く、結局Javaなどの言語で記述したスクリプトをコマンドプロンプトから実行する、などの使い方に留まっていましたが、そんな中でPowerShellで色々なことができるらしいという情報を耳にしました。
今回はPowerShellについて詳しく掘り下げてながら、PowerShellを実際に使った活用例なども紹介していきます。私が今回調べたかぎりPowerShellは大変優秀なツールですので、是非一読し、理解を深めて頂けたら幸いです。

PowerShellとは何か

PowerShellはWinodwsに標準搭載されているCUI(キャラクターユーザーインテーフェース)です。普段我々がPCを操作する際にはマウスを使って操作することが多いですが、これをGUI(グラフィカルユーザーインターフェース)と呼びます。これに対して、CUIは文字(キャラクター)を打って端末を操作するユーザーインターフェースです。WindowsではPowerShell以外にも「コマンドプロンプト」が搭載されています。
では、PCを利用するのにどうしてわざわざCUIを使う必要があるのでしょうか?その理由は、コマンド組み合わせて処理を自動化できることが挙げられます。またコマンドをファイルで保持することで、複数人で共有することも可能になります。上記の事から、普段手作業で行っている業務をCUIを使うことで自動化し効率化を図っていくことが可能になります。

PowerShellの特徴

PowerShellの特徴を見ていきます。

コマンドレット

f

PowerShellで用意されているコマンド(コマンドレット)は、私が調べたかぎり、629個ありました。 どのような種類のコマンドが用意されているかと言うと、アイテムの操作、日付操作、パスの操作、ジョブやトランザクションの操作、サービスの操作、プロセスの操作、コンピュータの操作、WEBやメールの操作など多岐に渡ります。

.Net Framework

PowerShellではコマンドレット以外にも、.Net Frameworkのクラスを利用することができます。PowerShellではコマンドレットで実行した結果は、.NET Frameworkのオブジェクトを返します。

パイプライン

パイプラインを使って、複数のコマンドレットを組み合わせて複雑な命令を可能にします。コマンドプロンプトでもパイプラインを使用することが可能ですが、テキストのみとなってしまいます。PowerShellのパイプではオブジェクトを渡すことが可能ですので、オブジェクト内の欲しい情報を取得、操作が可能になります。

PowerShell ISE

PowerShellでは専用の統合開発環境「PowerShell ISE」があります。メモ帳などのテキストエディタでも開発が可能ですが、PowerShell ISEを使った場合、ブレークポイントの設置、ステップイン(プログラムを1行ずつ読み込んでいく)などのデバッグが可能となります。また機能拡張が可能なので、必要なものがあればアドオンを設定することが可能になります。
従来のコマンドプロンプトと比較した場合、圧倒的にコマンドも豊富で他との連携も柔軟、そして開発も進めやすいという特徴があります。

PowerShellの活用例

次にPowerShellの活用例を見ていきます。上記で説明した通り、豊富なコマンドが用意されていますので、様々な活用例が考えられますが、今回はメール送信プログラムをPowerShellで開発していきましょう。
例えばシステムで障害が起こった場合、自動でメール通知してくれるプログラムがあれば大変便利です。本来であれば、PowerShell内でコマンドや別スクリプトを起動して、戻り値によってメール送信の有無を制御したいところですが、今回はメールの送信のみとします。以下実際に記述したプログラムとなります。
※今回はYahooメールを使用し、送信元と送信先は同一のもので設定しています。もしGmailでやってみたいという方は二段階認証などYahooメールとは異なる設定がありますので、ご自身で調べて実施してみてください。


# メール内容設定
1.$From="送信元メールアドレス"
2.$Subject="障害発生"
3.$body="障害が発生しました。"
4.$To="送信先メールアドレス
# 送信メールサーバーの設定
5.$SMTPServer="smtp.mail.yahoo.co.jp"
6.$Port="587"
7.$User="yahooのアカウント名"
8.$Password="パスワード"
9.$SMTPClient=New-Object Net.Mail.SmtpClient($SMTPServer,$Port)
# SSL暗号化通信しない $false
10.$SMTPClient.EnableSsl=$false
11.$SMTPClient.Credentials=New-Object Net.NetworkCredential($User,$Password)
12.$MailMassage=New-Object Net.Mail.MailMessage($From,$To,$Subject,$body)
# メールメッセージを送信
13.$SMTPClient.Send($MailMassage)


1~4では、メールの宛先、送信元、題名、本文を変数に設定しています。
5~8でではsmtpサーバーやポート、ユーザー名、パスワードを変数に設定しています。
9では、New-Objectコマンドレットを使い、.NET frameworkのSmtpClientクラスから5、6で設定した内容を引数にして、インスタンス化します。これで利用するSMTPサーバがインスタンスとして確立されます。
※SMTPサーバはメールを送信するためのサーバになります。YahooメールのSMTPサーバは「smtp.mail.yahoo.co.jp」、ポートは「587」となります。
10では通信の暗号化の有無を設定しています。今回は無しとします。
11では、9でインスタンス化したクラスにユーザーアカウント名とパスワードのプロパティを付与しています。
12では、New-Objectコマンドレットを使い、MailMessageクラスから1~4で設定した値をインスタンス化しています。これでメールの内容がインスタンス化されます。
13でインスタンス化したSMTPCLientのSendメソッドを使って、インスタンス化したMailMassageを引数にして送信しています。

送信する前にYahooメールの設定を少し変更する必要があります。既存の設定では、外部からのメール送信が不可となっている場合がありますので有効にしてください。以下がやり方になります。

1.Yahooメールにログイン。
2.右側の設定・利用規約押下。
3メールの設定からIMAP/POP/SMTPアクセスとメール転送押下。
4.「Yahoo! JAPAN公式サービス以外からのアクセスも有効にする」にチェック。
5.SMTPを有効にします。

実際に送信するとメールが届いているのが確認できるはずです。
※今回私は、送信元と送信先は、同一のメールをアドレスを使用しましたので、自分のメールアドレスからメールが届きました。

最後に

PowerShellについて理解を深めて頂けたのではないでしょうか?今回は活用例を一つしか紹介できませんでしたが、他にも数えきれないくらいたくさんの活用例が考えられます。例えば、ファイルの管理の一環で連携されたファイルにタイムスタンプを自動で付与するシステムの開発や、サーバーやPCの負荷を算出し、ファイルに出力するなどが挙げられます。
現場に出るとCUIを利用することは必ずあるので、初めてCUIを学習するのであればPowerShellはお勧めです。何故ならコマンド操作だけではなく、JavaやC#などに通じるオブジェクトやクラス、メソッドなどの概念にも触れることができるからです。Javaなどのプログラミング言語を勉強するのも良いですが、何かと手間もかかります。Winodwsを利用しているのであれば標準で搭載されていますので、すぐに始めることが可能です。またインターネット上に使い方や活用例などたくさんありますので、是非学習されるのをお勧めします。