🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

PowerShellとcmdの違いを比較して理解しよう【図解付き】

Windowsの「黒い画面」というと、多くの人が古くからの「コマンドプロンプト(cmd.exe)」を思い浮かべるかもしれません。しかし、これまでの記事で私たちが学んできたのは、青い背景が特徴的な、よりモダンで強力な「PowerShell」でした。この二つ、似ているようで実は全くの別物です。

「なぜ2種類もあるの?」「結局どっちを使えばいいの?」「cmdはもう古いの?」そんな疑問を抱えている方も多いのではないでしょうか。この記事では、そんな長年のライバル(?)であるPowerShellとコマンドプロンプトの違いを、具体的なタスクで比較しながら、初心者にも分かりやすく解説します。

この記事を読み終える頃には、あなたがなぜPowerShellを選ぶべきなのか、その圧倒的なメリットをはっきりと理解できているはずです。コマンドプロンプトという「トンカチ」と、PowerShellという「電動多機能ツール」の違いを、その目で確かめてみましょう!


最大にして決定的な違い:「オブジェクト」対「テキスト」

PowerShellとcmdの最も根本的な違い、それはコマンドが返す情報の形式です。ここを理解することが、両者の違いを理解する鍵となります。

コマンドプロンプト(cmd)の世界観:すべては「テキスト」

コマンドプロンプトでdirのようなコマンドを打つと、画面に表示されるのは、人間が読むために整形されたただの「テキスト(文字列)」です。それはまるで、紙に印刷されたリストのようなものです。リストから「ファイル名だけ」や「更新日時だけ」を抜き出して、次の処理に利用するのは非常に面倒で、複雑な文字列処理が必要になります。

C:\> dir
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は XXXX-XXXX です

 C:\ のディレクトリ

2024/07/07  09:00              Program Files
2024/07/07  09:05              Users
2024/07/07  09:10              Windows
               0 個のファイル                   0 バイト
               3 個のディレクトリ  123,456,789,012 バイトの空き領域

この出力結果は、ただの「文字の羅列」であり、プログラムにとっては構造を持たないデータです。


PowerShellの世界観:すべては「オブジェクト」

一方、PowerShellで似たようなコマンドGet-ChildItemを実行すると、返ってくるのは構造化された「オブジェクト」の集まりです。オブジェクトとは、様々な情報(プロパティ)を内包したデータの塊です。

【概念図】Get-ChildItemの返す「ファイルオブジェクト」の一つには、以下のような情報が整然と格納されています。

これはまるで、情報が整理されたExcelの表のようなものです。この構造のおかげで、PowerShellは「サイズが大きい順に並べて」とか「拡張子が.txtのものだけ表示して」といった、データに基づいた柔軟な処理が驚くほど簡単にできるのです。

PS C:\> Get-ChildItem

    ディレクトリ: C:\

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/07/07     09:00                Program Files
d-----        2024/07/07     09:05                Users
d-----        2024/07/07     09:10                Windows

見た目は似ていますが、裏側で扱っているデータの質が全く違う、という点が最も重要です。


実践比較:特定のタスクで比べてみよう

「現在実行中のサービスの中から、名前に'Windows'と付くものだけを、名前順で表示したい」という、少し複雑なタスクで両者を比較してみましょう。

コマンドプロンプト(cmd)での挑戦

cmdでこれを実現しようとすると、非常に困難です。net startでサービス一覧は取得できますが、結果はただのテキストです。ここから特定の文字を含む行を抜き出し、さらにそれを並べ替えるには、findstrsort、そして複雑なforループを駆使する必要があり、初心者にはほぼ不可能です。

C:\> net start
次の Windows サービスが開始されています:

   Application Host Helper Service
   Background Tasks Infrastructure Service
   Base Filtering Engine
   ...
   Windows Audio
   Windows Connection Manager
   Windows Defender Antivirus Service
   ...

このテキストの壁から、欲しい情報だけを正確に抜き出すのは至難の業です。


PowerShellでの華麗な解決策

PowerShellなら、オブジェクトとパイプラインのおかげで、この処理をたった一行で、直感的に書くことができます。

Get-Service | Where-Object { $_.DisplayName -like "*Windows*" } | Sort-Object -Property DisplayName

この一行は、以下のような処理を順番に行っています。

  1. Get-Service: 全てのサービスを「オブジェクト」として取得する。
  2. |: 取得したオブジェクト群を、次のコマンドへ渡す。
  3. Where-Object ...: 渡されたオブジェクトの中から、表示名(DisplayNameプロパティ)に "Windows" を含むものだけを絞り込む。
  4. |: 絞り込んだ結果を、さらに次のコマンドへ渡す。
  5. Sort-Object ...: 渡されたオブジェクトを、表示名(DisplayNameプロパティ)で並べ替える。

この比較で、PowerShellがいかにデータ処理に優れているか、そのメリットを実感いただけたのではないでしょうか。


コマンドや文法の違い

PowerShellは、cmdとの互換性のため、いくつかの古いコマンドを「エイリアス(別名)」として使うことができます。しかし、本来のコマンドレットや文法は、より現代的で一貫性のある設計になっています。

変数の扱い

cmd: set 変数名=値

set MYVAR=Hello World

PowerShell: $変数名 = 値

$myVar = "Hello World"

PowerShellでは変数名の前に$を付けるのがルールです。


条件分岐 (if文)

cmd:

if "%MYVAR%"=="Hello World" (echo Same)

PowerShell:

if ($myVar -eq "Hello World") { Write-Host "Same" }

PowerShellでは-eq (equal) や -gt (greater than) といった、より分かりやすい比較演算子が使われます。


cmdはもう不要?Windowsシェルの未来

「PowerShellがこんなに便利なら、コマンドプロンプトはもういらないの?」という疑問が浮かびますよね。答えは「いいえ、すぐにはなくなりません。しかし、新しいことは全てPowerShellで行うべきです」となります。

コマンドプロンプトは、非常に古いシステムや、過去に作られた膨大な数のバッチファイル(.bat)との互換性を保つために、今もWindowsに搭載されています。Microsoftがこれを完全に廃止する可能性は低いでしょう。

しかし、Windowsの標準ターミナルツールである「Windows Terminal」のデフォルト設定がPowerShellになっていることからも分かる通り、Microsoftが今後のWindows管理と自動化の中心として位置付けているのは、間違いなくPowerShellです。

これから新しくコマンドラインを学ぶなら、迷わずPowerShellを選ぶのが賢明な選択と言えるでしょう。


まとめ

今回は、PowerShellとコマンドプロンプト(cmd)の決定的な違いについて、図解(のイメージ)を交えながら比較しました。

これで、あなたがWindowsの黒い画面と向き合うとき、なぜPowerShellという「多機能ツール」を選ぶべきなのか、その理由が明確になったはずです。PowerShell入門シリーズは今回で一区切りとなりますが、あなたの自動化への旅はまだ始まったばかりです。ぜひ、日々の作業にPowerShellを取り入れて、その力を実感してみてください!