📖

ネタが尽きかけてるが無理やり話すPowerShellの活用方法

2024/11/09に公開

このネタについて

この話は、2024/11/9 の KOF2024 の「ネタが尽きかけてるが無理やり話すPowerShellの活用方法」で話した内容を記事としてまとめたものです。話の内容としては、

  • PowerShellが使える用途を見定める
  • 入れ込まない学習の取り組み方を考える
  • 話題が尽きていて私が思いの丈を語りたい (この内容に関してはこの記事では省きます)

というテーマで掘り下げたものです。PowerShellの技術ばかり掘り下げるだけでは上手に使いこなせません。いくら鋸の使い方に精通しても、鋸で釘は打てないようなものです。PowerShellにはPowerShellに適した使い方があります。用途を見定めて、どのようにPowerShellを勉強すれば上手く使いこなせるかを掘り下げていきます。

PowerShellの用途

PowerShellは、CLIのコマンドツールとして広く利用されています。そのの一般的な用途として、以下のようなものが挙げられます。

自動化:
システム管理や情報の自動取得、バッチ処理

システム管理:
Windows管理、リモート管理、Azureなどのクラウドサービス

演算処理:
データの加工、レポートの自動生成

一つ一つの処理について掘り下げてみます。

PowerShellによる自動化

PowerShellでの自動化は、複数のコマンドレットを組み合わせることで行われ、スクリプトファイル(.ps1)として保存しておくことで、手動操作を省いて簡単に繰り返し実行が可能です。ファイルの移動やコピー、アカウントの管理などの作業を自動化することができます。

また、スクリプトをタスクに登録することで自動で実行させることができ、モニタリングやサービスの立ち上げや停止などの制御を行う事もできます。

システム管理

PowerShellはWindowsに標準で組み込まれており、ネットワークやサービスの制御など、Windowsの設定を管理できるコマンドレットが揃っています。これらのコマンドレットを利用して、Windowsの設定を行ったり、設定内容や状態の確認を行うことができます。

また、モジュールをインストールすることで、AzureやAWSなどのプラットフォームの管理を行うことができます。

演算処理

PowerShellではCSVやJSONの読み込みや書き出しに対応しています。コマンドの実行結果や読みこんだデータを加工して、CSVやJSONに出力することができます。また、フィルタやソートをはじめ、正規表現での処理やデータのグルーピングを行うこともできます。

モジュールをインストールすることで、Excelのファイルの加工を行うこともできます。

PowerShellの特徴について

PowerShellには以下のような特徴があります。

  • Windows標準
  • 動詞-名詞(Verb-Noun)形式のコマンドレット
  • 文字列ではなくPSObjectでの出力

これらの特徴について、一つ一つ掘り下げてみます。

Windows標準

PowerShellはWindowsの標準機能として、OSをインストールした状態から何もせずに利用できるようになっています。Windows のメニューから、PowerShellを実行すれば、プロンプトが起動してコマンドレットを実行することができます。

メリット:
Microsoftがサポートしていて、Windowsで何もしなくても使えて汎用性が高い。

デメリット:
LinuxやMacではPowerShellを別途インストールしなければ利用できません。また、利用できるコマンドレットも、システムの設定に関するコマンドレットが実装されていません。

Windows で利用するには便利ですが、Linux や Mac で利用するにはそれなりに手間がかかります。PowerShellを使って恩恵が大きいのは、Windowsのユーザになります。

コマンドレット名の命名規則

PowerShell のコマンドレットは、動詞と名詞で構成された一貫した命名規則を持っています。動詞-名詞(Verb-Noun)のような形でコマンドレットの名前が降られており、コマンドレットの機能が直感的にわかりやすくなります。

例:
Get-Process: プロセスを取得する
Set-Service: サービスの設定を行う
Remove-Item: アイテムを削除する

動詞の部分は何をするか(動作)を示します。PowerShell には、推奨される動詞のセットがあります。例えば、Get(取得)、Set(設定)、Remove(削除)のようなものがあります。

名詞の部分は操作対象のリソースやオブジェクトを表します。名詞は単数形で記述され、操作する対象のリソースを指定します。例えば、Process(プロセス)、Service(サービス)のようなものがあります。

このような命名規則に沿うことで、以下のようなメリットとデメリットがあります。

メリット:

  • オプションの付け間違えによる誤操作を回避できる。
  • 直観的で分かり易い

デメリット:

  • コマンドレットが長くなる
  • コマンドの種類が多くなる

プロンプトで操作する場合は、コマンドが長いために補完の機能を利用することが前提になります。コマンドレットの名前が長くなりますが、コマンドレットの名前を見ればどのような処理をするかが分かり易いです。その波面、簡素にコマンドラインやスクリプトを書きたい人にとっては、これがデメリットになるようです。

PSObjectでの出力

Unix系のコマンドの場合、出力の形式はすべて文字列になります。PoewrShell の場合はオブジェクトとして出力されます。その出力されるオブジェクトが PSObject の形式になります。PSObject には以下のような特徴があります。

  • プロパティやメソッドを操作することができる。
  • カスタムプロパティの追加ができる。
  • パイプラインで次のコマンドにデータを渡すことができる。

プログラミング言語を扱ったことのない人にはオブジェクトというものが分かりづらいかもしれません。簡単に言えば、コマンドレットの出力が文字列ではなく、構造を持ったデータとして出力されます。

メリット:

  • 簡単な構文で複雑な処理が可能
  • CSVやJSONへの加工がしやすい
  • 出力の際の整形がしやすい

デメリット:

  • PowerShellでしかこの方式を使えない
  • 処理がそんなに早くない
  • 事前に仕組みを知らないと適切に処理ができない

プログラミング言語を扱ったことがあるかどうかで、PSObjectで出力される仕様について意見が分かれるところになります。PowerShellは、Micorosft の提供する .Net の仕組みを多く受け継いでいます。オブジェクトに関する仕組みも、.Netに近いものとなっています。

Powershellのアドバンテージ

  • Windowsを使う場合のアドバンテージが高い
  • プログラミング言語に携わった人に馴染みやすい
  • 大規模な演算よりも小規模の細かい演算に向いている

特徴を追っていくと、Powershellだからと言って絶対的なアドバンテージがある訳ではありません。PowerShellの特性を掴んだうえで、その特性に合った使い方をすることで真価が発揮されます。

入れ込まないPowershellの学習

PowerShellを実際に使っていると、ある程度定石になる処理を覚えれば、おおよその処理に対応できるようになります。CLIのツールを実務で使うような環境であれば、一~二年くらい学習する程度で実用に耐えられるレベルになれるようです。個人の学習においても、操作をCLIで行う習慣を付ければ、同様の期間で実用に耐えられるレベルに到達できるかと思います。

何を覚えればいいか

PowerShellを使いこなすには、まずは多く触れることが大事です。コマンドレットを多く暗記するより、まずはCLIで何回もコマンドレットを実行することです。基本的な操作であれば、ネットで簡単に調べることができます。ただし、基本的なコマンドを覚えた後に何を覚えていけばいいかという情報は少ないように感じます。

PowerShellの基本を覚えたら、以下のような操作を身に付けると、PowerShellを効率的に使いこなすことができるようになります。

  • モジュールの管理方法
  • コマンドの調べ方
  • 補完のしかた

モジュールの管理方法

PowerShellは、モジュールを追加することで機能を拡張することができます。PowerShellを使いこなす上で、モジュールを管理できるようになることは重要です。以下の四つのコマンドを使いこなせば、基本的なModuleの管理に対応できます。

  • Get-InstalledModule -> インストールされているモジュールの一覧
  • Find-edModule -> モジュールを探す
  • Install-Module -> モジュールをインストールする
  • Uninstall-Module -> モジュールをアンインストールする

Install-Module でスコープ -Scope を指定して、AllUsers(システムにインストール)か CurrentUser(カレントユーザのみインストール)を選ぶことができる。

コマンドの調べ方

PowerShellの使い方はPowerShellから調べることができます。

  • Get-Help
  • Get-Command

このコマンドの使い方を覚えるだけで、Webで検索する回数が半減します。

Get-Help
コマンドレットのヘルプを表示するコマンドレットです。引数に調べたいコマンドレットを入れると、ヘルプが表示されます。

詳しい情報を知りたい時は、-Online のオプションを付けて実行てみましょう。標準的なコマンドであれば、ブラウザでヘルプが開きます。ブラウザを開いて検索せずに、ダイレクトにWeb上のヘルプが参照できます。

Get-Command
利用できるコマンドレットを表示するコマンドレットです。コマンドレット名だけでなく、Verb(動詞)やNoun(名詞)の部分を指定して調べることができます。モジュールをインストールした時、-Module のオプションでモジュールを指定すれば、どういうコマンドレットが追加されたかが確認できます。

PowerShellでは、コマンドレット名を見ればおおよそ何ができるのか判別がつくようになっています。コマンドレットの名前が調べられることで、おおよそどのようなことができるかを読み取ることができます。

補完のしかた

迷ったら Ctrl + Spase で補完。後補が出力されて、矢印ボタンで選べる。
コマンドレットのオプションが知りたい時は、コマンドレットを入力して - を入れて Ctrl + Space で一覧が表示される。

※これを知っていれば、プロンプトの補完で「どんなコマンドレットがあるか」と「どんなオプションがあるか」をリアルタイムに確認できる。

PowerShellでやらない方が良いもの

使いこなせば、PowerShellは便利なツールです。ただし、向いている用途とそうでない用途があります。PowerShellの特性を活かした使い方をすれば便利ですが、逆にC#やPHPなどのプログラミング言語を利用した方が適切な使い方もあります。

  • コーディングスキルの追求
  • 大規模な仕組みの作成
  • GUIを用いたプログラミング
  • Excelと連携したシステム

コーディングスキルの追求

PowerShellで複雑なコーディングをしていると、C#に近い書き方になっていきます。PowerShellでClassを実装することもできますが、それが有効なケースはあまり見かけません。また、コマンドレットの一つ一つの名前が長いので、複雑なコーディングにはあまり向きません。逆に可読性やメンテナンス性が落ちてしまうかもしれません。

このような特性上、Webで配布するようなものでもない限り、そこまでコード量が増えることはありません。また、規模の大きいコーディングをすると、Powershellの持ち味が損なわれてしまします。公開するようなものを作りたければC#で書くことをお勧めします。

大規模な仕組みの作成

Powershellは大規模な開発には向きません。大規模な仕組みを作成する場合、DBの連携やWebインターフェイスの実装などが伴います。このようなコンポーネントと連携することはできますが、仕組みとして用意されていません。

大規模な仕組みになるケースとしては、ユーザの操作が入るような場合があります。プロンプトの表示や入力に対するバリデーションなどを行うために、コード量が増えます。ただし、Powershellを利用して行うようような処理の場合、用途ごとにスクリプトを分けて引数で挙動を制御することが多いです。

このようなデメリットを避ける方法を突き詰めると、「C#で書いた方が効率的」という結論に辿り着きます。大規模な仕組みを作成する場合は、IDE(統合開発環境)を利用することになります。PowerShellには、大規模な開発に対応できるようなIDEが用意されていません。PowerShellではC#の仕組みを利用しているので、規模の大きなコードを書くことはできますが、効果的かどうかは疑問です。Powershellでは単体処理の方が強みが活かせます。

GUIを用いたプログラミング

C#で利用している仕組みを流用すれば、PowerShellでもGUIのプログラミングを書くことができます。ただし、情報が非常に少ないので難易度が高いです。また、C#を想定している仕組みをPowerShellでりようすることになります。場合によっては、利用できない機能があったりするかもしれません。

また、GUIを用いたプログラミングをIDE無しで行うことは非常に難しいです。結果的には、C#で簡単に書けるコードを、わざわざPowerShellを利用して難しく書いているだけ。ということになるかもしれません。手間と成果が釣り合わなくなり易いです。PowerShellを利用したGUIを用いたプログラミングはお勧めできません。

Excelと連携したシステム

Powershellでは、ImportExcelというモジュールを使用することで、Excelのファイルの読み書きができます。また、COMオブジェクト経由でExcelを直接操作することもできます。

一見便利そうに見えますが、ImportExcelのモジュールを利用した場合、あくまでExcelのファイルの編集のみになります。ExcelをGUIで操作した時の挙動を再現してくれません。そのため、思うような操作をしようと思うとコーディングの内容が煩雑になりがちです。

COM経由でのExcelのそうさですが、COMオブジェクトの利用自体がMicrosoftで非推奨となっています。エラーが起きた時にExcelのプロセスがそのまま残ってしまうなど、仕組み上の欠陥もあります。VBAのような感覚でコーディングをできる反面、エラー処理が非常に難しいです。

最近のExcelではデータ連携の機能が強化されています。もし、Excelと連携した処理を行いたいのであれば、CSVで出力したデータをExcelのPowerQueryで読み込んだり、Excelの表形式のデータの読み込みのみで利用するような方法で連携すると、シンプルでメンテナンス性の良い仕組みが書けます。

Excelでするべき処理はExcelで完結できるように仕組みを設計しましょう。

PowerShellを活用するにあたって

PowerShellにはいろいろな機能が実装されています。とはいえ、利用する機能は限られています。 無理せず覚えた範囲を使えば、十分に役に立ちます。

機能だけで言えば、PoewrShellにClassを定義する機能があったりします。しかし、実際に利用する上で、Classの機能を使っている事例を見かけたことがありませんでした。関数を適切に利用できれば、日常の業務で使うレベルであれば十分に事足ります。

定石になる使い方をマスターすれば、その組み合わせで様々なケースに対応できるようになります。PoewrShellのコンセプトを押えておくことで、少ない労力で有効に活用できると思います。

Discussion