コマンドプロンプトとパワーシェルの違い¶
📁 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 | 現在も積極開発中(推奨) |
現在インストールされているか確認する方法:
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 オブジェクトパイプライン¶
コマンドプロンプトのパイプ(|)はテキストを渡す:
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