コンテンツにスキップ

コマンドプロンプトとパワーシェルの違い

📁 docs/it-learning/artifact/20260309_コマンドプロンプトとパワーシェルの違い.md

作成日: 2026-03-09 関連issue: #86(コマンドプロンプトとパワーシェルの違い)


1. コマンドプロンプト(cmd.exe)とは

コマンドプロンプト(Command Prompt)は、Windows に昔から搭載されているテキストベースのシェル。

  • 実行ファイル: C:\Windows\System32\cmd.exe
  • MS-DOS 時代(1980年代)の流れを汲む、歴史の長いコマンドラインインターフェース
  • Windows に最初から入っており、追加インストール不要
  • できることはシンプルで、ファイル操作・プログラム実行・バッチファイル実行など基本的な操作を担う
特徴:
  - テキスト(文字列)ベースで処理する
  - 「バッチファイル」(.bat / .cmd)でスクリプトを書く
  - できることは比較的限定的
  - 古いシステムや設定ファイルで「cmd で実行」と書かれていることが多い

2. PowerShell とは

PowerShell は Microsoft が開発した、より高機能なシェル兼スクリプト言語。

  • 実行ファイル: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe(旧版)/ pwsh.exe(新版)
  • 2006年に Windows PowerShell として登場、2016年以降は「PowerShell Core」としてオープンソース化
  • Windows だけでなく macOS・Linux でも動作する(クロスプラットフォーム)
  • コマンドの出力が「テキスト」ではなく「オブジェクト」であることが最大の特徴
特徴:
  - オブジェクト指向のパイプライン(後述)
  - 「コマンドレット(Cmdlet)」という統一された命名規則のコマンド
  - .NET ライブラリを直接呼び出せる
  - Windows システム設定・管理作業に強い(レジストリ、Active Directory、IIS 等)
  - スクリプトファイルは .ps1 拡張子

Windows PowerShell vs PowerShell(Core)

名称 バージョン 対応OS 状態
Windows PowerShell 1.0 〜 5.1 Windows のみ メンテナンスモード(新機能追加なし)
PowerShell(Core) 6.0 〜 Windows / macOS / Linux 現在も積極開発中(推奨)

現在インストールされているか確認する方法:

powershell -v         # Windows PowerShell のバージョン
pwsh --version        # PowerShell(Core)のバージョン


3. 両者の主な違い

比較項目 コマンドプロンプト PowerShell
登場時期 1987年(MS-DOS 3.3) 2006年
コマンド体系 MS-DOS 由来のコマンド(dir, copy 等) 動詞-名詞形式のコマンドレット(Get-ChildItem, Copy-Item 等)
スクリプト言語 バッチファイル(.bat / .cmd) PowerShell スクリプト(.ps1)
パイプラインの出力 テキスト(文字列) オブジェクト
.NET との連携 不可 直接呼び出し可能
エラーハンドリング 限定的(%ERRORLEVEL% 変数) try/catch 構文が使える
変数 %VAR% 形式 $VAR 形式
クロスプラットフォーム Windows のみ Windows / macOS / Linux
システム管理機能 基本的なもののみ Active Directory・レジストリ・WMI 等に対応
拡張性 限定的 モジュールを追加してコマンドを拡張できる

テキストパイプライン vs オブジェクトパイプライン

コマンドプロンプトのパイプ(|)はテキストを渡す:

# ファイル一覧の中から "log" という文字を含む行を検索
dir | findstr "log"
# → テキスト行をそのまま次のコマンドに渡す

PowerShell のパイプはオブジェクトを渡す:

# ファイルオブジェクトの Name プロパティが "log" を含むものを抽出
Get-ChildItem | Where-Object { $_.Name -match "log" }
# → ファイル情報を持つオブジェクトがそのまま渡されるため、プロパティ操作が可能

オブジェクトとして扱えるため、次のような操作が直感的にできる:

# 「ファイルサイズが 1MB 以上のファイルを取得してサイズ順に並び替え」
Get-ChildItem -File | Where-Object { $_.Length -gt 1MB } | Sort-Object Length -Descending

4. コマンド対応表

よく使う操作の対応コマンド一覧:

操作 コマンドプロンプト PowerShell PowerShell エイリアス
ファイル・フォルダ一覧 dir Get-ChildItem ls, dir, gci
ファイルのコピー copy Copy-Item cp, copy
ファイルの移動 move Move-Item mv, move
ファイルの削除 del / erase Remove-Item rm, del
フォルダの作成 mkdir New-Item -ItemType Directory mkdir, md
フォルダの削除 rmdir /s Remove-Item -Recurse
カレントディレクトリ表示 cd / chdir Get-Location pwd, gl
ディレクトリ移動 cd <path> Set-Location <path> cd, sl
ファイル内容表示 type Get-Content cat, type
テキスト検索 findstr Select-String sls
プロセス一覧 tasklist Get-Process ps, gps
プロセス終了 taskkill /PID <id> Stop-Process -Id <id> kill
環境変数の表示 set Get-ChildItem Env: ls Env:
環境変数の設定 set VAR=value $Env:VAR = "value"
コマンド履歴 doskey /history Get-History history, h
画面クリア cls Clear-Host cls, clear
コマンドの場所確認 where Get-Command gcm
ヘルプの表示 help <cmd> / /? Get-Help <Cmdlet> help, man
ネットワーク疎通確認 ping <host> Test-Connection <host>
DNS 確認 nslookup Resolve-DnsName
IPアドレス確認 ipconfig Get-NetIPAddress

PowerShell には多くのエイリアスが設定されており、cmd のコマンドをそのまま入力できる場合が多い。 ただしスクリプトで使う場合は正式なコマンドレット名を使うことが推奨される(可読性と移植性のため)。


5. どちらを使うべきか

コマンドプロンプトが向いている場面

  • 古いレガシーシステムや設定手順書に cmd コマンドが書かれている場合
  • .bat ファイルとの互換性を保ちたい場合
  • シンプルなコマンド実行(ping, ipconfig, netstat 等)を素早く行いたい場合
  • PowerShell の実行ポリシーで制限されている環境での応急処置

PowerShell が向いている場面

  • Windows の設定変更・管理作業(ユーザー管理、ネットワーク設定等)
  • 複数のファイルを条件で絞り込んで一括操作したい場合
  • 定期実行・自動化スクリプトを書く場合
  • API を呼び出す・JSON を処理する場合(Invoke-RestMethod, ConvertFrom-Json 等)
  • .NET の機能を使いたい場合

結論

新しく学ぶなら PowerShell を習得する方が長期的に有益。

コマンドプロンプトは「知っておく」程度で十分で、日常的な自動化・管理作業は PowerShell で行うのが現代の標準的なアプローチ。


6. Windows Terminal との関係

Windows Terminal は、コマンドプロンプト・PowerShell・WSL を統合して使えるターミナルアプリ。

Windows Terminal
├── タブ1: PowerShell(pwsh)
├── タブ2: コマンドプロンプト(cmd.exe)
├── タブ3: WSL(Ubuntu)
└── タブ4: Azure Cloud Shell
  • Windows Terminal 自体はシェルではなく、シェルを表示するコンテナ(ホスト)
  • 複数のシェルをタブで切り替えられる
  • 外観カスタマイズ(フォント、カラースキーム、透明度)が可能
  • Windows 11 ではデフォルトのターミナルとして設定されている
アプリ 役割
Windows Terminal ターミナルエミュレーター(器)
PowerShell シェル(実際にコマンドを解釈・実行する)
コマンドプロンプト シェル(実際にコマンドを解釈・実行する)

7. bash / zsh(Unix 系シェル)との比較

Linux・macOS の標準シェルである bash や zsh と比べた場合:

比較項目 bash / zsh PowerShell
主な利用OS Linux / macOS Windows(macOS / Linux でも動作可)
パイプライン テキストベース オブジェクトベース
スクリプト構文 POSIX sh 系(シンプル) .NET 統合(より豊富な型)
パッケージ管理 apt / brew / dnf 等 PowerShellGet(PSGallery)
起動速度 速い やや遅い
Web・API 操作 curl / wget Invoke-RestMethod / Invoke-WebRequest
テキスト処理 grep, sed, awk が強力 Select-String, Where-Object で対応

WSL(Windows Subsystem for Linux)を使えば Windows 上で bash を動かすことも可能。 本格的な Linux 系ツールチェーン(Docker, Git, Python の CLI ツール等)を使う場合は WSL が有力な選択肢になる。


8. 実務でよく使う PowerShell コマンド例

ファイル操作

# カレントディレクトリのファイル一覧(詳細表示)
Get-ChildItem -Force

# 特定の拡張子のファイルを再帰的に検索
Get-ChildItem -Recurse -Filter "*.log"

# ファイル内の特定文字列を検索
Select-String -Path ".\*.txt" -Pattern "ERROR"

# ファイルをコピー(上書き確認なし)
Copy-Item "source.txt" "destination.txt" -Force

# フォルダを中身ごとコピー
Copy-Item "source_dir" "dest_dir" -Recurse

# 古いファイルを削除(30日以上前のもの)
Get-ChildItem "C:\Logs" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item

プロセス管理

# 実行中のプロセス一覧(CPU使用率順)
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10

# 特定のプロセスを強制終了
Stop-Process -Name "notepad" -Force

# 指定したポートを使っているプロセスを調べる
netstat -ano | Select-String ":8080"

ネットワーク

# IPアドレス確認
Get-NetIPAddress -AddressFamily IPv4

# 疎通確認(ping の代替)
Test-Connection -ComputerName "google.com" -Count 3

# DNS 名前解決
Resolve-DnsName "github.com"

テキスト・データ処理

# CSV ファイルを読み込んでフィルタリング
Import-Csv "data.csv" | Where-Object { $_.Status -eq "active" }

# JSON を処理
$json = Get-Content "config.json" | ConvertFrom-Json
$json.version

# テキストファイルに追記
Add-Content "log.txt" "処理完了: $(Get-Date)"

Windows 管理

# インストール済みソフトウェアの一覧
Get-Package | Sort-Object Name

# サービスの状態確認
Get-Service | Where-Object { $_.Status -eq "Running" }

# サービスの起動・停止
Start-Service -Name "wuauserv"
Stop-Service -Name "wuauserv"

# レジストリの読み取り
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "ProductName"

スクリプト実行に関する注意

PowerShell にはスクリプトの実行ポリシーが設定されている:

# 現在の実行ポリシーを確認
Get-ExecutionPolicy

# スクリプト実行を許可(現在のユーザーのみ)
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
ポリシー 意味
Restricted スクリプト実行不可(デフォルト)
RemoteSigned ローカルのスクリプトは実行可。インターネットからのものは署名が必要
Unrestricted すべてのスクリプトを実行可(セキュリティ上非推奨)
Bypass ポリシーをバイパス(CI/CD 環境等で使用)

まとめ

コマンドプロンプト(cmd.exe)
  = Windows 旧来のシェル
  = MS-DOS 由来のコマンド体系
  = テキストベースのパイプライン
  = レガシー互換・シンプルな用途向け

PowerShell(pwsh)
  = Windows 現代のシェル + スクリプト言語
  = オブジェクトベースのパイプライン
  = .NET 統合・システム管理に強い
  = 自動化・本格的なスクリプトに最適

Windows Terminal
  = どちらも(+WSL も)使えるターミナルアプリ
  = 「器」であり、シェル本体ではない

おすすめの使い分け:
  日常の簡単な確認 → どちらでもOK(エイリアスで互換性あり)
  自動化・システム管理 → PowerShell
  Linux ツールチェーン → WSL + bash