はじめに
Windowsでコマンドを実行するとき、
- コマンドプロンプト
- PowerShell
の2つが存在します。
昔からWindowsを使っている方であればコマンドプロンプトに馴染みがある一方、近年ではPowerShellが標準的に利用されるようになっています。
本記事では、
- Windowsコマンド環境の歴史
- コマンドプロンプトとPowerShellの違い
- PowerShell ISEとPowerShell (x86)
- それぞれの使いどころ
について整理します。
Windowsコマンド環境の歴史
まずは歴史的な流れを見てみましょう。
MS-DOS
Windowsが普及する前は、MS-DOSというCUI(Character User Interface)のOSが利用されていました。
この頃はキーボードからコマンドを入力して操作するのが一般的でした。
コマンドプロンプト
Windows NT系OSの登場により、MS-DOSの後継としてコマンドプロンプトが登場しました。
現在でもWindowsに標準搭載されていて、
- バッチファイル(.bat)
- コマンドファイル(.cmd)
の実行環境として利用されています。
PowerShell
2006年にWindows PowerShellが登場しました。
コマンドプロンプトとは異なり、オブジェクト指向を採用し、.NETを基盤としてシステム管理や自動化を行うために設計されています。
現在ではWindowsだけでなく、
- Linux
- macOS
でも利用できます。
その後、PowerShell Coreとしてオープンソース化され、現在は単に「PowerShell」と呼ばれています。
PowerShell Coreからクロスプラットフォームに対応し、PowerShell 7ではその流れを引き継いでいます。
コマンドプロンプトとPowerShellの違い
| 項目 | コマンドプロンプト | PowerShell |
|---|---|---|
| 実行ファイル | cmd.exe | powershell.exe / pwsh.exe |
| 扱うデータ | 文字列 | オブジェクト |
| スクリプト | .bat、.cmd | .ps1 |
| 対応OS | Windows | Windows、Linux、macOS |
| .NET利用 | × | ○ |
| JSON操作 | × | ○ |
| REST API | × | ○ |
最も大きな違いは、
コマンドプロンプトは文字列を扱い、
PowerShellはオブジェクトを扱う
という点です。
コマンドプロンプト
メリット
-
軽量で起動が速い
dircopydelなどの簡単な操作はコマンドプロンプトで十分です。
-
DOSコマンドとの互換性
古い管理ツールや業務システムとの互換性があります。
デメリット
-
文字列しか扱えない
例えば、tasklistの結果は単なる文字列です。
特定のプロセスだけ取得したい場合は、tasklist | findstr chromeのように文字列検索を行う必要があります。
-
自動化には限界がある
JSONやXMLを扱ったり、REST APIを呼び出したりするには工夫が必要です。
複雑な管理処理を書くには向いていません。
PowerShell
メリット
-
オブジェクトを扱える
PowerShellではGet-Processを実行すると、各プロセスは単なる文字列ではなく、NameIdCPUWorkingSetなどのプロパティを持ったオブジェクトとして取得されます。
例えばCPU使用時間が100秒を超えるプロセスだけ取得するには、Get-Process | Where-Object CPU -gt 100のように簡単に記述できます。
-
.NETライブラリが利用できる
PowerShellは.NET上で動作しています。
そのため、[System.IO.File]::Exists("sample.txt")のように.NETのクラスライブラリを直接利用できます。
-
JSON・CSV・XMLを簡単に扱える
JSONならGet-Content sample.json | ConvertFrom-Json
CSVならImport-CsvExport-Csv
XMLなら[xml]$xml = Get-Content sample.xml
といったコマンドレットが用意されています。
-
REST APIを簡単に呼び出せる
Invoke-RestMethodを利用するだけでREST APIを呼び出せます。
Webサービスとの連携が非常に簡単です。
-
Windows管理との相性が良い
PowerShellでは- Active Directory
- Microsoft 365
- Azure
- Exchange
- SharePoint
などの管理も行えます。
Microsoft製品の管理では事実上の標準となっています。
デメリット
-
学習コストがやや高い
オブジェクトやパイプラインなど、コマンドプロンプトとは考え方が異なります。
-
バッチファイルとは文法が異なる
if文やfor文などもPowerShell独自の書き方になります。
そのため、cmd経験者でも最初は戸惑うことがあります。
PowerShell ISEとPowerShell (x86)
PowerShell ISEとは
PowerShell ISE(Integrated Scripting Environment)は、PowerShell専用の統合開発環境です。
主な機能は次のとおりです。
- スクリプト編集
- 構文の色分け
- コード補完
- デバッグ
- ブレークポイント
PowerShellスクリプトを開発しやすい環境として長年利用されてきました。
現在は新機能の追加は終了しており、MicrosoftはVisual Studio Code + PowerShell拡張機能の利用を推奨しています。
PowerShell (x86)とは
- Windows PowerShell
- Windows PowerShell (x86)
の2つがあります。
これは32bit版と64bit版の違いです。
通常版(64bit)
64bit DLLや64bit COMコンポーネントへアクセスできます。
通常はこちらを利用します。
x86版(32bit)
古い32bitアプリケーションやCOMコンポーネントとの互換性を保つための環境です。
- 古いActiveX
- 32bit Office
- 古いCOMライブラリ
などを利用する場合に必要になります。
現在では利用する機会はかなり少なくなっています。
それぞれの使いどころ
新規開発でコマンドプロンプト用のバッチファイルを新たに作成するケースは少なくなっており、自動化や運用スクリプトを書くのであればPowerShellを選択するのが一般的です。
- 既存バッチの保守
- 古い業務システム
- 簡単なファイル操作
であればコマンドプロンプトでも十分です。
おわりに
コマンドプロンプトは長年Windowsを支えてきたコマンド環境であり、現在でも多くの既存システムで利用されています。
一方、PowerShellはオブジェクト指向や.NETとの連携を取り入れた高機能なシェルであり、
Microsoftが継続的に機能改善を行っているプラットフォームです。
既存のバッチファイルを無理にPowerShellへ移行する必要はありませんが、新しくスクリプトを書くのであればPowerShellを選ぶことをおすすめします。
また、PowerShellを学ぶ際はPowerShell ISEではなく、Visual Studio CodeとPowerShell拡張機能を利用すると、今後も長く活用できる開発環境を構築できます。