[Part.1] Windowsの革命【PowerShell】って何なんだ?

PoweShellとは1

このページは、「PowerShell入門」基礎知識編Part.1です。

まずはPowerShellの概要についてザックリと知っていきましょう。入門者のあなたにPowerShellを好きになってもらうため、できるだけわかりやすく概要解説していきます!

このページの想定読者
  1. PowerShellをこれから使い始めようと思っている!
  2. 名前は聞いたことあるけど何ができるのか良く分かってない。
  3. コマンドプロンプトは使ってたけど乗り換えたい。

入門の第一歩!PowerShellを知ろう

PowerShellを最も簡潔に説明すると、

Microsoft が提供するWindowsシステム管理用の「コマンドシェル」でありオブジェクト指向の「スクリプト言語」

のことです。

今でこそOSS化しWindows環境以外でも動作させることができますが、PowerShellは「Windows Server 2008 R2 / Windows 7」から標準搭載されたWindows管理用のCLIツールだったのです。

多少知見がある方は、Windowsの管理といえばGUIでの操作やコマンドプロンプト(cmd.exe)を思い浮かべるかもしれません。PowerShellはコマンドプロンプトと同じCLIツールですが、これまでの管理方法に比べより「便利」で「強力」に「使いやすく」なっています!!

MEMO
  1. GUI(グラフィカル・ユーザ・インタフェース)
    • マウスでクリックなどで視覚的にコンピューターを操作すること
  2. CLI(コマンド・ライン・インターフェース)
    • キーボードによるコンソール画面入力でコンピューターを操作すること

また、PowerShellではコマンドレットを組み合わせて「一連の処理」や「複雑な処理」を記述し様々なスクリプトツール(≒プログラム)を作成することができます。

PowerShell誕生以前のWindows環境では、バッチファイルやVBスクリプトでちょっとしたツールを作成していましたが、PowerShellでスクリプトを作成すると、より高度な処理を実現することができます。

PowerShellとコマンドプロンプトの違い

コマンドプロンプトはシステムに対しコマンドで命令するのに対し、PowerShell では「コマンドレット」と呼ばれる命令を使用します。

大事なのは「コマンドレット」の部分です。「コマンド」がCLIでコンピューターに命令するモノの総称とすれば、「コマンドレット」はPoweShellを介してコンピューターに命令するモノと覚えておけばよいでしょう。

正確なコマンドレットの違いについて、Microsoftのドキュメントを引用すると以下のように定義されています。

・コマンドレットは .NET クラスのインスタンスです。これらはスタンドアロンの実行可能ファイルではありません。

・コマンドレットは、数十のコード行から作成できます。

・コマンドレットは、通常、独自の解析、エラー表示、または出力書式設定を行いません。 解析、エラー表示、および出力の書式設定は、PowerShell ランタイムによって処理されます。

・コマンドレットは、テキストのストリームからではなく、パイプラインからの入力オブジェクトを処理します。また、コマンドレットは通常、オブジェクトをパイプラインに出力として配信します。

・コマンドレットは、一度に1つのオブジェクトを処理するため、レコード指向です。

コマンドレットの概要 – PowerShell | Microsoft Docs | © Microsoft

「コマンド」と「コマンドレット」の違いがわかれば、あなたはもう立派な PowerSheller(パワーシェル使い)の一員になれたことでしょう!

あなたが「コマンド」と「コマンドレット」の違いを知らないまま PowerShellを使ってしまうと、こんなことになりかねません。

とある日の昼下がり、、、

あなた
あなた

○○のコマンドが、エラー吐いちゃって…。鈴木君助けて~

鈴木君
鈴木君

ん・・・?

鈴木君
鈴木君

○○なんて「コマンド」は知らないからわかんないや。

※鈴木君はPowerShellが大好き

しっかりと違いを抑えていれば、

とある日の昼下がり、、、

あなた
あなた

○○のコマンドレットが、エラーいちゃって…。鈴木君助けて~

鈴木君
鈴木君

○○のエラーかい?

鈴木君
鈴木君

それはね○○実行に管理者権限が必要でね…あっそうだエラー文を見てご覧。ほらここn….

※鈴木君はPowerShellが大好き

このテンションの上がった鈴木君のように、レットをつけることにこだわっている人もいます。非常に大事なのでしっかり覚えておきましょう。

チェシャ男
チェシャ男

冗談はさておき、話を戻してPoweShellの特徴を見ていきましょう。

PowerShellの5つの特徴

チェシャ男が考える【PowerShell の5つの特徴】を簡単にまとめます。

PowerShell の5つの特徴
  1. なんといっても標準装備
  2. 文法・用法が共通していてわかりやすい!
  3. .NETが使える!
  4.  様々なデータへのアクセスが可能!
  5. ゆとり仕様の開発環境

それぞれについて、順番に説明していきます。

1.なんといっても標準装備!

冒頭でも述べた通り、PowerShellはWindows Server 2008 / Windows 7から標準機能として搭載されました。あなたが使っているような、それ以降の新しいOSのPCやサーバであれば最初からインストールされているので、すぐに使うことができます。

さて、この標準搭載の何が良いかお分かりでしょうか?

余計なソフトをインストールする必要がないんです!

さらに、どのマシンでも同じ動きをしてくれるんです!

これは非常に大切なことです。

インフラの現場ではよくありますが、標準機能以外のツールやソフトウェアをサーバにインストールする場合、ツールの要件を確認したりきちんと作動するかテストしたりする必要がり、コストや負担が増えてしまいます。

また、「どのマシンでも同じ動きをしてくれる」ということは、一度作ったスクリプトツールは、他のコンピューターで再利用ができます。

チェシャ男
チェシャ男

効率よく仕事がしたい人には、とっても心強い味方ですね。

2.文法・用法が共通していてわかりやすい

PowerShell のコマンドレットは、ある法則(命名規則)に従って作られています。

コマンドレットの命名規則
[動詞]-[名詞]

例)
CopyItem = アイテムコピーする
アイテム消す = RemoveItem

このように、コマンドレットの動作が英単語の意味から簡単に推測できます。逆に「こんな動作をさせたい!」という場合にも、英語から考えるとコマンドレットを推測することが出来ます。

また、コマンドレットにはオプション(パラメータ)というものが用意されていてコ、マンドレットの動作を詳しく指定することが出来ます。基本的にオプションも英語の意味に従って命名されています。

コマンドレットのオプション
[-(ハイフン)英単語]

例)
Path → ファイルやフォルダのパスを指定する
Force → 動作を強制する

コマンドプロンプトの時はコマンドごとにオプションの指定方法が異なっていたり、アルファベット1文字で覚えづらかったりと大変な思いしませんでしたか?

その点、PowerShellでは覚えなくても推測しやすいので非常に使いやすいです。

3..NETが使える

PowerShellは.NETが動作要件になっており、「CLR」(共通言語ランタイム)という.NETを実行するための仮想マシンのような仕組みの上で動作しています。

「CLRの上で動く」ということについてざっくり噛み砕いて図説します。

従来のコマンド(コマンドプロンプト)では、マシンに対してコマンドで直接指示を出しているとします。

コマンド処理

対してPoweShellのコマンドレットでは.NETを経由してマシンとやりとりをするのです。

コマンドレット処理

コンピューターで処理された結果は再度.NET通り、PowerShell上にオブジェクトとして返却(戻り値)されます。オブジェクトは様々なプロパティ値(ファイル名や日付情報など)を含んだインスタンスになっています。

このオブジェクトは.NETの処理で生成されたインスタンスのことで、プロパティと呼ばれる属性とメソッドと呼ばれる機能を持っています。

かなり噛み砕いて説明すると、色々な情報をまとめたデータのかたまりだと思ってください。コマンドレットを実行すた際の戻り値は単なる文字列ではなくて、いろんなデータがまとまって返ってくるということです。

オブジェクト概念

また、戻り値をオブジェクトとして受け取れるPowerShellでは、”|(パイプライン)”を使って次のコマンドレットに処理を渡すことで、再度.NETクラスとデータのやりとりを行うことが可能です。

この「オブジェクトのパイプライン渡し」がPowerShellの大きな特徴で、他のシェル言語との大きな違いでもあります。

パイプライン(パイプ処理)

コマンドレットA | コマンドレットB


例)
Get-Process | Sort-Object

オブジェクトをパイプラインで渡すという概念を説明します。

従来のコマンドでパイプを使用する場合は、戻り値(出力結果)である文字列を次のコマンドに渡しています。

コマンドパイプ

このように複数のコマンドを通して結果を整形したいときは、特定の文字列を抽出したり変数に一旦代入したりと力業なテクニックが必要でした。

比べてPowerShellでは、コマンドレットからコマンドレットへオブジェクトとしてデータのかたまりをパイプラインで渡すことができます。

コマンドレットパイプ

PowerShellの様に戻り値のデータを「かたまり」として扱うことができれば、処理結果に対し必要に応じて特定のデータ列をSelect (選択)することで抽出できます。

文章だけではわかりづらいと思うので、実際の出力で考えてみましょう。下のような出力結果から「フォルダ名のみの一覧」を取得するとします。

c:\>dir

 c:\ のディレクトリ

2011/01/21  19:41    <DIR>          Intel
2009/07/14  11:37    <DIR>          PerfLogs
2016/09/15  21:01    <DIR>          Program Files
2016/09/22  02:56    <DIR>          share
2011/04/26  22:35    <DIR>          temp
2011/04/06  16:05    <DIR>          Users
2011/04/06  16:11    <DIR>          util
2016/06/27  01:17    <DIR>          Windows
         0 個のファイル         0 バイト
         9 個のディレクトリ  280,406,130,688 バイトの空き領域

ここからフォルダ名一覧を抽出しようとすると、

  1. フォルダ一覧の結果が出力されている部分(7~14行目)だけを FIND で抽出
  2. 変数に保存するか、ファイルに書き出す
  3. ループで一行ずつ呼び出し、更新日~<DIR>までを空白などに置換
  4. 空白を削除
PS C:\> Get-ChildItem

    ディレクトリ: C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2011/01/21     19:41            Intel
d----        2009/07/14     11:37            PerfLogs
da---        2016/09/15     21:01            Program Files
d----        2016/09/22      2:56            share
d----        2011/04/26     22:35            temp
da---        2011/04/06     16:05            Users
da---        2011/04/06     16:11            util
da---        2016/06/27      1:17            Windows

ここからフォルダ名一覧を抽出しようとすると、

  1. Name プロパティを Select(名前列を選択)

少し顕著に書きすぎましたが、2つの間でこんなにも手間が違うんです。

なんとなくでも、PowerShellは便利そうだと思ってもらえましたか?

4.様々なデータへのアクセス

この特徴は、始めたばかりの頃だとあまり恩恵を受けられないかもしれませんが、管理・運用にPowerShellを使いだすと非常に有用です。

PowerShellでは、「ファイルシステム」「レジストリ」「デジタル署名」「環境変数」「エイリアス」「スクリプト変数」「関数」など様々なデータの種類に対して、ドライブ(PSドライブ)としてアクセスすることが出来ます。

つまり、コマンドプロンプトで操作するときの

ファイルにアクセスする感覚

で、レジストリのデータを見たり環境変数を変更したりすることができるんです。コマンドプロンプトでは扱うデータごとに操作方法が違っていたものが、一律の操作方法で統一することができます。

NOTE

レジストリ参照などは特に簡単になりましたが、逆に言えばセキュリティホールにもなりやすいという懸念点でがあります。

サーバ管理を自動化したりスクリプトを作成したりする段階になると、この特徴が非常に生きてきます。

5.ゆとり仕様の開発環境

WidowsのPowerShellには、Windows PowerShell Integtrated Scripting Enviroment(通用:ISE)という統合開発環境が標準で同梱されています。

ise

左上の白い部分がスクリプティングゾーン、左下の青部分がプロンプトで、ISEではコマンドレットの実行はもちろん、スクリプト形式のツール開発・デバッグなどが可能です。

また、右部には非常に便利なコマンドレットのヘルプが表示されています。

拡大してみると、

Powershell ISEのヘルプ-チェシャわら

この様に、コマンドレットが使用可能なオプションを表示してくれますし、右下のボタンからは[Run(実行)]や[Insert(挿入)]まで代行してくれます。

チェシャ男
チェシャ男

便利すぎて、こればかり使っているとコマンドレットを覚えられません(笑)

まとめ

「PowerShell入門」基礎知識編Part.1はいかがでしたか?

ここまで読んでくれたあなたなら、PowerShellの概要・特徴について理解できたと思います。

最後に、もう一度まとめるとPoweShellとは

Microsoft が提供するWindowsシステム管理用の「コマンドシェル」であり「スクリプト言語」

であり、次の5つの特徴があります。

PowerShell の5つの特徴
  1. なんといっても標準装備
  2. 文法・用法が共通していてわかりやすい!
  3. .NETが使える!
  4.  様々なデータへのアクセスが可能!
  5. ゆとり仕様の開発環境
チェシャ男
チェシャ男

疑問点等があれば、お気軽にコメント・お問い合わせください!

次の「PowerShell入門」基礎知識編Part.2では、PowerShellを使用する際の要件やバージョンについて学んでいきます。

[Part.2]インストール可能なPowerShellのバージョンと要件を確認!

9 COMMENTS

匿名

Powershell使いたいけど、なに?っていう初心者なのでとてもわかりやすくてよかったです。

返信する
三月ウサギ

特徴の .NET Frameworkが使えると言うのは、ファイル等の戻り値がオブジェクトとして返ってくるので、オブジェクトのプロパティを指定してやれば欲しい値に簡単に取ってこれるから便利という認識であってますか?
また、様々なデータにアクセス出来るのところにレジストリとありますが、これは何ですか?調べてみましたがイマイチイメージが掴めません。説明かわかりやすく説明しているサイトを教えていただけだら嬉しいです。よろしくお願いします。

返信する
チェシャ 男

>>三月ウサギ様

コメントありがとうございます。不思議な国のお仲間ですね(^^♪

そうですね!
オブジェクトとして操作できることによりファイルオブジェクトであれば更新日や拡張子などなど属性をプロパティとして取得することができます。操作用のメソッドも用意されているので移動や削除といった操作も可能です。

レジストリというのはWindowsのOSが使用するシステムの設定情報やユーザー別の設定情報が格納されている内部のDBのようなものです。
分かりやすいのでいえば、使用中のプリンタ情報や設定している壁紙情報、接続したことがあるネットワークなど普段何気なくコントロールパネルやシステム設定で見るような情報が入っています。
PowerShellではレジストリの情報を確認したり変更したりすることができるので、スクリプトで壁紙を変えるといったこともできるはずです!

返信する
川畑

分かりにくい,イントロが長過ぎる
コマンドレット等々が何かを説明するより,身近に必要と感じる簡単な例から説明してほしい.

私の場合,指定フォルダーの中のファイルの大きい順 を知りたい,何かgciみたいなもの使うようだが指定パスが不正で受け付けられない.

返信する
別府

普段はくだらない揚げ足取りばかりなのにPC業務になると新人に教えてもらってやってもらうのを当然だと思っていた元同僚を思い出すなあ。

返信する

コメントを残す

メールアドレスが公開されることはありません。