CMD・PowerShell・Bash コマンド対応表
同じ作業をコマンドプロンプト、PowerShell、bash で横に並べて比較。ファイル、grep、環境変数、プロセス、ネットワーク、サービス、スクリプトまで。
最終確認日:2026-10-18、Microsoft Learn の PowerShell 7.6 / Windows PowerShell 5.1 リファレンス、Windows コマンド リファレンス、GNU Bash 5.2 マニュアル で確認。
ファイルとフォルダー
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| ファイルを一覧表示 # PowerShell のエイリアス:gci、dir、Windows では ls。 | dir | Get-ChildItem | ls -l |
| すべてのファイルを再帰的に一覧表示 # | dir /s /b | Get-ChildItem -Recurse -File | find . -type f |
| 現在のディレクトリを表示 # CMD では引数なしの cd で現在のディレクトリを表示します。PowerShell のエイリアス:pwd、gl。$PWD 変数でも取得できます。 | cd | Get-Location | pwd |
| ディレクトリを移動 # CMD でフォルダーと一緒にドライブも切り替えるには /d が必要です。PowerShell のエイリアス:cd、sl、chdir。 | cd /d D:\work | Set-Location D:\work | cd /home/me/work |
| ホームディレクトリに移動 # | cd %USERPROFILE% | Set-Location ~ | cd ~ |
| フォルダーを作成(親フォルダーも) # CMD の mkdir は、コマンド拡張機能がオン(デフォルト)なら途中のフォルダーも作成します。PowerShell の mkdir は New-Item -ItemType Directory をラップした関数です。 | mkdir a\b\c | New-Item -ItemType Directory -Path a\b\c | mkdir -p a/b/c |
| 空のファイルを作成 # | type nul > file.txt | New-Item file.txt | touch file.txt |
| ファイルをコピー # | copy src.txt dst.txt | Copy-Item src.txt dst.txt | cp src.txt dst.txt |
| フォルダーを再帰的にコピー # xcopy src dst /E /I でも可能です。robocopy はサポートされているツールで、再開や再試行ができます。 | robocopy src dst /E | Copy-Item src dst -Recurse | cp -r src dst |
| フォルダーを完全にミラーリング 危険 # 危険: どちらもコピー元にないファイルをコピー先から削除します。2 つのパスを逆にすると、残したかったフォルダーが消えます。robocopy /L と rsync -n で事前に試せます。 | robocopy src dst /MIR | (no cmdlet; call robocopy) | rsync -a --delete src/ dst/ |
| ファイルを移動 # | move a.txt archive\ | Move-Item a.txt archive\ | mv a.txt archive/ |
| ファイル名を変更 # | ren old.txt new.txt | Rename-Item old.txt new.txt | mv old.txt new.txt |
| ファイルを削除 # | del file.txt | Remove-Item file.txt | rm file.txt |
| フォルダーと中身を削除 危険 # 危険: ごみ箱には入らず、/q、-Force、-f を付けると確認もありません。先にパスを確認してください。PowerShell では -WhatIf を付けると削除対象を確認できます。 | rmdir /s /q folder | Remove-Item folder -Recurse -Force | rm -rf folder |
| シンボリックリンクを作成 # Windows では、開発者モードがオンでない限り、シンボリックリンクの作成に管理者権限のプロンプトが必要です。引数の順序に注意:CMD/PowerShell はリンクが先、ln はターゲットが先です。 | mklink link.txt target.txt
mklink /D linkdir targetdir | New-Item -ItemType SymbolicLink -Path link.txt -Target target.txt | ln -s target.txt link.txt |
| ファイルのアクセス権を変更 # Windows は rwx ビットではなく ACL を使います。通常は Set-Acl より icacls のほうが簡単です。 | icacls file.txt /grant alice:F | Get-Acl / Set-Acl | chmod 644 file.txt |
| ファイルのチェックサム(SHA-256) # Get-FileHash のデフォルトは SHA256 で、他は -Algorithm MD5 や SHA1 で指定します。macOS:shasum -a 256。 | certutil -hashfile file.iso SHA256 | Get-FileHash file.iso | sha256sum file.iso |
| zip ファイルを作成 # tar.exe(bsdtar)は Windows 10 1803 以降に標準搭載されています。-a は拡張子 .zip から形式を判断します。 | tar -a -c -f out.zip folder | Compress-Archive -Path folder -DestinationPath out.zip | zip -r out.zip folder |
| zip ファイルを展開 # | tar -xf out.zip | Expand-Archive out.zip -DestinationPath dest | unzip out.zip -d dest |
ファイル内容の読み書き
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| ファイルの内容を表示 # PowerShell のエイリアス:gc、type、Windows では cat。 | type file.txt | Get-Content file.txt | cat file.txt |
| ファイルをページ単位で表示 # | more file.txt | Get-Content file.txt | Out-Host -Paging | less file.txt |
| 先頭の 10 行 # -Head は -TotalCount のエイリアスです。 | 組み込みコマンドなし | Get-Content file.txt -TotalCount 10 | head -n 10 file.txt |
| 末尾の 10 行 # | 組み込みコマンドなし | Get-Content file.txt -Tail 10 | tail -n 10 file.txt |
| ログファイルを追跡表示 # | 組み込みコマンドなし | Get-Content app.log -Tail 10 -Wait | tail -f app.log |
| ファイルにテキストを書き込む(上書き) # CMD では、> の前のスペースもファイルに書き込まれます。Windows PowerShell 5.1 の > は UTF-16 LE、PowerShell 7 は BOM なし UTF-8 で書き込みます。Set-Content -Encoding utf8 ならどちらでも明示できます。 | echo hello> file.txt | 'hello' | Set-Content file.txt | echo hello > file.txt |
| ファイルにテキストを追記 # | echo hello>> file.txt | Add-Content file.txt 'hello' | echo hello >> file.txt |
| 行数を数える # | find /c /v "" file.txt | (Get-Content file.txt).Count | wc -l file.txt |
| 2 つのファイルを比較 # Windows の PowerShell では、diff はテキストの差分ではなく Compare-Object のエイリアスです。 | fc a.txt b.txt | Compare-Object (Get-Content a.txt) (Get-Content b.txt) | diff a.txt b.txt |
| 行を並べ替え # | sort file.txt | Get-Content file.txt | Sort-Object | sort file.txt |
| 重複行を除く # | 組み込みコマンドなし | Get-Content file.txt | Sort-Object -Unique | sort -u file.txt |
| ファイル内のテキストを置換 # -replace は正規表現を使います。かっこによって、Set-Content がファイルを開き直す前にファイル全体が読み込まれます。macOS の sed では -i '' が必要です。 | 組み込みコマンドなし | (Get-Content f.txt) -replace 'old','new' | Set-Content f.txt | sed -i 's/old/new/g' f.txt |
検索(grep に相当するもの)
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| ファイル内のテキストを検索 # Select-String はデフォルトで大文字・小文字を区別しません(区別するには -CaseSensitive)。サブフォルダーも対象にするには:Get-ChildItem -Recurse -Filter *.log | Select-String error。 | findstr /s /i /n "error" *.log | Select-String -Path *.log -Pattern error | grep -rin 'error' --include='*.log' . |
| コマンドの出力を絞り込む # | ipconfig | findstr IPv4 | ipconfig | Select-String IPv4 | ip a | grep inet |
| 一致しない行 # | findstr /v "DEBUG" app.log | Select-String -Path app.log -Pattern DEBUG -NotMatch | grep -v DEBUG app.log |
| 正規表現で検索 # findstr は正規表現のごく一部しかサポートしません(| や {n} は不可)。Select-String は .NET の正規表現を使います。 | findstr /r "^ERR.*timeout" app.log | Select-String -Path app.log -Pattern '^ERR.*timeout' | grep -E '^ERR.*timeout' app.log |
| 名前でファイルを探す # | dir /s /b *.log | Get-ChildItem -Recurse -Filter *.log | find . -name '*.log' |
| プログラムの場所を調べる # PowerShell では where は Where-Object のエイリアスです。CMD のツールを使うには where.exe と入力します。 | where git | Get-Command git | command -v git |
環境変数
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| すべての変数を一覧表示 # | set | Get-ChildItem Env: | env |
| 変数を読み取る # | echo %PATH% | $env:PATH | echo "$PATH" |
| このセッションで設定 # CMD:= の前後にスペースを入れないでください。入れると名前や値の一部になります。 | set MY_VAR=hello | $env:MY_VAR = 'hello' | export MY_VAR=hello |
| 永続的に設定(自分のユーザー) # setx と SetEnvironmentVariable は新しいウィンドウにのみ反映され、現在のウィンドウには反映されません。setx は 1024 文字を超える値を切り捨てるため、PATH の編集には使わないでください。 | setx MY_VAR hello | [Environment]::SetEnvironmentVariable('MY_VAR','hello','User') | echo 'export MY_VAR=hello' >> ~/.bashrc |
| 変数を削除 # | set MY_VAR= | Remove-Item Env:MY_VAR | unset MY_VAR |
| PATH にフォルダーを追加(セッション) # Linux/macOS の PowerShell 7 では、PATH の区切りは ; ではなく : です。[IO.Path]::PathSeparator で正しい区切り文字を取得できます。 | set PATH=%PATH%;C:\tools | $env:PATH += ';C:\tools' | export PATH="$PATH:/opt/tools" |
| 1 つのコマンドだけに設定 # | 組み込みコマンドなし | $env:DEBUG = '1'; ./app; Remove-Item Env:DEBUG | DEBUG=1 ./app |
プロセス
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| プロセスを一覧表示 # | tasklist | Get-Process | ps aux |
| 名前でプロセスを探す # | tasklist /FI "IMAGENAME eq chrome.exe" | Get-Process chrome | pgrep -a chrome |
| プロセス ID で終了 # /F や -Force なしでは、Windows はプロセスに終了を依頼します。kill は SIGTERM を送り、kill -9 は強制終了します。 | taskkill /PID 1234 /F | Stop-Process -Id 1234 -Force | kill 1234 |
| 名前で終了 # | taskkill /IM notepad.exe /F | Stop-Process -Name notepad | pkill notepad |
| プログラムを起動 # start の空の "" はウィンドウのタイトルです。これがないと、引用符で囲んだプログラムのパスがタイトルとして扱われます。 | start "" notepad.exe | Start-Process notepad | gedit & |
| 管理者 / root として実行 # Windows PowerShell 5.1 では pwsh の代わりに powershell を使います。Windows 11 24H2 以降では、設定で組み込みの sudo コマンドを有効にすることもできます。 | runas /user:Administrator cmd | Start-Process pwsh -Verb RunAs | sudo command |
| CPU 使用量の上位 10 プロセス # Get-Process の CPU は起動からの合計プロセッサ秒数で、現在の % ではありません。 | 組み込みコマンドなし | Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 | ps aux --sort=-%cpu | head |
| ポートを使っているものを調べる # Get-NetTCPConnection は Windows 専用です。netstat -ano の最後の列が PID なので、tasklist /FI "PID eq 1234" で調べます。 | netstat -ano | findstr :8080 | Get-NetTCPConnection -LocalPort 8080 | sudo ss -ltnp | grep :8080 |
ネットワーク
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| IP アドレスを表示 # Get-NetIPAddress などの Net* コマンドレットは Windows 専用です(NetTCPIP モジュール)。 | ipconfig /all | Get-NetIPAddress | ip addr |
| ホストに ping # Windows の ping はデフォルトで 4 回で止まり、Linux の ping は Ctrl+C を押すまで続きます。 | ping -n 4 example.com | Test-Connection example.com -Count 4 | ping -c 4 example.com |
| TCP ポートをテスト # Test-NetConnection は Windows 専用です。PowerShell 7 では:Test-Connection example.com -TcpPort 443。 | 組み込みコマンドなし | Test-NetConnection example.com -Port 443 | nc -zv example.com 443 |
| DNS の名前解決 # Resolve-DnsName は Windows 専用です。nslookup は 3 つすべてにあります。 | nslookup example.com | Resolve-DnsName example.com | dig example.com |
| 経路を追跡 # | tracert example.com | Test-NetConnection example.com -TraceRoute | traceroute example.com |
| DNS キャッシュをクリア # bash の行は systemd-resolved を使うシステム向けです。 | ipconfig /flushdns | Clear-DnsClientCache | sudo resolvectl flush-caches |
| HTTP GET(API 呼び出し) # Invoke-RestMethod は JSON をオブジェクトに変換し、Invoke-WebRequest はステータス、ヘッダー、生のコンテンツを返します。 | curl.exe https://api.example.com/items | Invoke-RestMethod https://api.example.com/items | curl https://api.example.com/items |
| ファイルをダウンロード # curl.exe は Windows 10 1803 以降に標準搭載されています。Windows PowerShell 5.1 で Internet Explorer が設定されていないマシンでは、Invoke-WebRequest に -UseBasicParsing を付けます。 | curl.exe -L -o file.zip https://example.com/file.zip | Invoke-WebRequest https://example.com/file.zip -OutFile file.zip | curl -LO https://example.com/file.zip |
| JSON を POST # CMD には単一引用符がないため、curl.exe では内側の二重引用符をバックスラッシュでエスケープします。 | curl.exe -X POST -H "Content-Type: application/json" -d "{\"a\":1}" https://api.example.com | Invoke-RestMethod https://api.example.com -Method Post -ContentType 'application/json' -Body (@{a=1} | ConvertTo-Json) | curl -X POST -H 'Content-Type: application/json' -d '{"a":1}' https://api.example.com |
| サーバーに SSH 接続 # OpenSSH クライアントは Windows 10 1809 以降と Windows 11 にデフォルトでインストールされています。 | ssh user@host | ssh user@host | ssh user@host |
サービスとシステム
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| サービスを一覧表示 # Windows PowerShell 5.1 では sc は Set-Content のエイリアスなので、sc.exe と入力します。PowerShell 6 以降ではこのエイリアスは削除されています。 | sc query | Get-Service | systemctl list-units --type=service |
| サービスの状態 # | sc query Spooler | Get-Service Spooler | systemctl status nginx |
| サービスを開始 / 停止 # | net start Spooler
net stop Spooler | Start-Service Spooler
Stop-Service Spooler | sudo systemctl start nginx
sudo systemctl stop nginx |
| サービスを再起動 # | net stop Spooler && net start Spooler | Restart-Service Spooler | sudo systemctl restart nginx |
| 起動時に開始 # sc.exe では start= の後にスペースが必要で、前にはスペースを入れません。 | sc config Spooler start= auto | Set-Service Spooler -StartupType Automatic | sudo systemctl enable nginx |
| OS とハードウェアの情報 # | systeminfo | Get-ComputerInfo | uname -a; cat /etc/os-release |
| コンピューター名 # | hostname | $env:COMPUTERNAME | hostname |
| 現在のユーザー # Windows の PowerShell では $env:USERNAME でも取得できます。 | whoami | whoami | whoami |
| ディスクの空き容量 # 古い Windows では fsutil に管理者権限のプロンプトが必要です。Get-Volume(Windows 専用)でもサイズと空き容量を確認できます。 | fsutil volume diskfree C: | Get-PSDrive -PSProvider FileSystem | df -h |
| 稼働時間 # Get-Uptime は PowerShell 6 以降です。5.1 では:(Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime。 | systeminfo | find "Boot Time" | Get-Uptime | uptime |
| 今すぐ再起動 # | shutdown /r /t 0 | Restart-Computer | sudo reboot |
| 画面をクリア # Windows の PowerShell では cls と clear のどちらも使えます。 | cls | Clear-Host | clear |
| コマンド履歴 # Get-History はこのセッションの履歴だけです。PSReadLine は古い履歴を (Get-PSReadLineOption).HistorySavePath のファイルに保存しており、3 つのシェルすべてで Ctrl+R で検索できます。 | doskey /history | Get-History | history |
| コマンドのヘルプ # PowerShell の完全なヘルプをダウンロードするには、Update-Help を一度実行します(5.1 では管理者権限が必要)。 | dir /? | Get-Help Get-ChildItem -Examples | man ls |
| 現在の日付 # %date% はマシンの地域設定の形式に従うため、これを解析するスクリプトはロケールが違うと動かなくなります。 | echo %date% | Get-Date -Format 'yyyy-MM-dd' | date +%F |
| 5 秒待つ # | timeout /t 5 | Start-Sleep -Seconds 5 | sleep 5 |
| 出力をクリップボードにコピー # macOS:pbcopy。Wayland:wl-copy。PowerShell では Get-Clipboard で読み取れます。 | dir | clip | Get-ChildItem -Name | Set-Clipboard | ls | xclip -selection clipboard |
オブジェクトのパイプとテキストのパイプ
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| 列 / プロパティを選ぶ # PowerShell は .NET オブジェクトをパイプで渡すため、列を解析する代わりにプロパティ名で選べます。 | 組み込みコマンドなし | Get-Process | Select-Object Name, Id, WS | ps -eo comm,pid,rss |
| 値で行を絞り込む # PowerShell は 500MB や 1GB のようなリテラルを理解します。awk は 6 列目(KB 単位の RSS)を比較します。 | tasklist | findstr chrome | Get-Process | Where-Object WS -gt 500MB | ps aux | awk '$6 > 500000' |
| 項目ごとに処理する # $_(または $PSItem)が現在のオブジェクトです。.bat ファイルでは %f の代わりに %%f と書きます。 | for %f in (*.txt) do echo %f | Get-ChildItem *.txt | ForEach-Object { $_.Name } | for f in *.txt; do echo "$f"; done |
| オブジェクトのプロパティを調べる # PowerShell で最も役立つ調査用コマンドです。| Format-List * も試してみてください。 | 組み込みコマンドなし | Get-Process | Get-Member | 組み込みコマンドなし |
| JSON を解析 # -Raw を使うとファイルが 1 つの文字列として渡されます。出力には ConvertTo-Json -Depth 10 を使います(デフォルトの深さは 2)。 | 組み込みコマンドなし | Get-Content data.json -Raw | ConvertFrom-Json | jq . data.json |
| CSV を読み込んで絞り込む # Import-Csv の値は文字列です。数値で比較するには [int] でキャストします。 | 組み込みコマンドなし | Import-Csv users.csv | Where-Object { [int]$_.Age -gt 30 } | awk -F, 'NR>1 && $3 > 30' users.csv |
| CSV に書き出す # -NoTypeInformation は PowerShell 6 以降ではデフォルトですが、5.1 では必要です。 | 組み込みコマンドなし | Get-Process | Export-Csv procs.csv -NoTypeInformation | ps -eo pid,comm --no-headers | awk '{print $1","$2}' > procs.csv |
| 件数、合計、平均 # | find /c /v "" file.txt | Get-ChildItem -File | Measure-Object Length -Sum -Average | ls -l | awk '{s+=$5} END {print s}' |
スクリプト:変数、条件分岐、ループ、関数
| やりたいこと | CMD(コマンド プロンプト) | PowerShell | Bash(Linux/macOS) |
|---|---|---|---|
| 変数を設定 # bash:= の前後にスペースを入れません(name = Ada は name というコマンドを実行します)。 | set name=Ada | $name = 'Ada' | name=Ada |
| 文字列内で変数を使う # | echo Hello %name% | "Hello $name" | echo "Hello $name" |
| 算術演算 # CMD と bash は整数演算のみです。PowerShell は .NET の数値を使います。 | set /a n=5*3 | $n = 5 * 3 | n=$((5 * 3)) |
| ユーザー入力を読み取る # | set /p name=Name: | $name = Read-Host 'Name' | read -rp 'Name: ' name |
| スクリプトの引数 # .bat ファイルでは %~1 で前後の引用符が取り除かれます。PowerShell のスクリプトでは param() ブロックで名前付き・型付きのパラメーターを使えます。 | %1 %2 … %* | $args[0] or param($Path) | $1 $2 … "$@" |
| 文字列での if / else # PowerShell の比較演算子は単語です:-eq -ne -gt -lt -like -match。= と > は代入とリダイレクトです。 | if "%a%"=="yes" (echo on) else (echo off) | if ($a -eq 'yes') { 'on' } else { 'off' } | if [ "$a" = "yes" ]; then echo on; else echo off; fi |
| 数値を比較 # CMD:EQU NEQ LSS LEQ GTR GEQ。 | if %n% GTR 5 echo big | if ($n -gt 5) { 'big' } | if (( n > 5 )); then echo big; fi |
| ファイルが存在する場合 # | if exist file.txt echo yes | if (Test-Path file.txt) { 'yes' } | if [ -f file.txt ]; then echo yes; fi |
| 直前のプログラムの終了コード # PowerShell では、$? は直前のコマンドの成否を $true/$false で、$LASTEXITCODE は直前のネイティブ プログラムの数値コードを表します。 | echo %ERRORLEVEL% | $LASTEXITCODE | echo $? |
| 成功時 / 失敗時だけ次のコマンドを実行 # パイプライン チェーン演算子 && と || は PowerShell 7.0 で導入され、Windows PowerShell 5.1 ではエラーになります。 | build && deploy
build || echo failed | build && deploy (PowerShell 7+)
build; if ($?) { deploy } (5.1) | build && deploy
build || echo failed |
| リストをループ処理 # | for %i in (a b c) do echo %i | foreach ($x in 'a','b','c') { $x } | for x in a b c; do echo "$x"; done |
| 1 から 5 までループ # | for /l %i in (1,1,5) do echo %i | foreach ($i in 1..5) { $i } | for i in {1..5}; do echo "$i"; done |
| ファイルの各行をループ処理 # | for /f "usebackq delims=" %l in ("file.txt") do echo %l | foreach ($line in Get-Content file.txt) { $line } | while IFS= read -r line; do echo "$line"; done < file.txt |
| while ループ # CMD には while がないため、.bat ファイルでラベルと goto を使います。 | :loop
set /a i+=1
if %i% lss 5 goto loop | while ($i -lt 5) { $i++ } | while [ "$i" -lt 5 ]; do i=$((i+1)); done |
| 関数を定義して呼び出す # PowerShell の関数はコマンドと同じように呼び出します:Greet("Ada") ではなく Greet Ada。 | call :greet Ada
goto :eof
:greet
echo Hello %~1
exit /b | function Greet($Name) { "Hello $Name" }
Greet Ada | greet() { echo "Hello $1"; }
greet Ada |
| コマンドの出力を変数に格納 # | for /f "delims=" %i in ('hostname') do set h=%i | $h = hostname | h=$(hostname) |
| 出力を捨てる # | command >nul 2>&1 | command *> $null | command >/dev/null 2>&1 |
| コメント # | rem comment
:: comment | # comment
<# block #> | # comment |
| スクリプト ファイルと実行方法 # PowerShell は .\ を付けないと現在のフォルダーのスクリプトを実行せず、完全にブロックすることもあります。下の実行ポリシーを参照してください。 | script.bat | .\script.ps1 | chmod +x script.sh && ./script.sh |
PowerShell のエイリアスの落とし穴:ls、curl、wget、sc、where
PowerShell には、Unix や CMD のコマンドに見えて、実際はパラメーターの異なるコマンドレットを実行するエイリアスがあります。どれが存在するかはエディションと OS によって異なります。Get-Alias name を使うと、セッションでその名前が何を指すかを確認できます。
| 入力するもの | Windows PowerShell 5.1 | Windows の PowerShell 7 | Linux/macOS の PowerShell 7 |
|---|---|---|---|
curl5.1 で本物の curl を使うには curl.exe と入力します。curl のフラグ(-X、-H、-d)は Invoke-WebRequest では意味を持ちません。 | Invoke-WebRequest | エイリアスではない:curl.exe を実行 | ネイティブの curl |
wgetInvoke-WebRequest url -OutFile name か、curl.exe -LO url を使います。 | Invoke-WebRequest | エイリアスではない(Windows にはデフォルトで wget なし) | ネイティブの wget(インストール済みの場合) |
ls, dirls -la のようなフラグは Windows では失敗します。Get-ChildItem -Force を使います。 | Get-ChildItem | Get-ChildItem | ls = ネイティブの ls、dir = Get-ChildItem |
cat, type | Get-Content | Get-Content | cat = ネイティブの cat、type = Get-Content |
cp, mv, rm, rmdirrm -rf は PowerShell では無効です。Remove-Item -Recurse -Force を使います。 | Copy-Item, Move-Item, Remove-Item | 同じコマンドレット | ネイティブ コマンド |
ps, kill | Get-Process, Stop-Process | 同じコマンドレット | ネイティブ コマンド |
sort, tee, diffWindows の PowerShell で diff a b を実行すると、2 つのファイルの行ではなくオブジェクトを比較します。 | Sort-Object, Tee-Object, Compare-Object | 同じコマンドレット | ネイティブ コマンド |
sc5.1 で sc query を実行すると、query という名前のファイルが作られます。sc.exe を使います。 | Set-Content | エイリアスではない:sc.exe を実行 | なし |
whereプログラムを探すには where.exe か Get-Command を使います。 | Where-Object | Where-Object | Where-Object |
echoecho -n では改行を抑制できません。Write-Host -NoNewline を使います。 | Write-Output | Write-Output | Write-Output |
man | help | help | ネイティブの man |
クォートとエスケープ
「あるシェルでは動くのに別のシェルでは失敗する」バグの多くは、クォートが原因です。エスケープ文字はシェルごとに異なります。
| 項目 | CMD | PowerShell | Bash |
|---|---|---|---|
| リテラル文字列(展開なし) | リテラル用の引用符なし:%VAR% は "…" の中でも展開される | 'Cost: $5' | 'Cost: $5' |
| 変数を含む文字列 | "Hello %name%" | "Hello $name, it is $(Get-Date -Format t)" | "Hello $name, it is $(date +%R)" |
| エスケープ文字 | ^(例:^& ^| ^>) | ` バッククォート(例:`n 改行、`t タブ、`$ リテラルの $) | \ バックスラッシュ |
| 引用符で囲んだ文字列内の引用符 | 多くのプログラムでは "…" の中で ""。プログラムによって異なる | 'It''s' または "Say `"hi`"" | 'It'\''s' または "Say \"hi\"" |
| 行の継続 | 行末に ^ | 行末に `(または行末を | にする) | 行末に \ |
| スクリプト内のリテラルの % や $ | .bat ファイルでは %% | 単一引用符内の '$' または `$ | 単一引用符内の '$' または \$ |
| 引数をそのままネイティブ プログラムに渡す | (不要) | --% で行の残りを PowerShell が解析しないようにする | (不要) |
ネイティブ プログラム(curl.exe、git、node)へのクォートの渡し方は PowerShell 7.3 で変わりました。二重引用符を含む引数がそのまま渡されるようになり、$PSNativeCommandArgumentPassing で制御します。Windows PowerShell 5.1 では、同じ JSON 本文の内側の引用符を二重にエスケープする必要があることが多く、そのため Invoke-RestMethod と ConvertTo-Json の組み合わせに切り替える人が多くいます。
実行ポリシー:「このシステムではスクリプトの実行が無効になっています」
実行ポリシーが Restricted のとき、PowerShell は .ps1 ファイルを実行しません。これは Windows クライアント エディション(Windows 10 と 11)の Windows PowerShell の実質的なデフォルトです。Windows Server のデフォルトは RemoteSigned で、ローカルのスクリプトは実行でき、ダウンロードしたものは署名かブロック解除が必要です。Linux と macOS ではポリシーは Unrestricted で、変更できません。
Get-ExecutionPolicy -Listはすべてのスコープのポリシーを表示します。定義されている中で最も限定的なスコープが優先されます(グループ ポリシーはすべてに優先)。Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserで、管理者権限なしで自分のスクリプトを実行できるようになります。Unblock-File .\script.ps1は、信頼できるスクリプトから「インターネットからダウンロード」のマークを消します。pwsh -ExecutionPolicy Bypass -File script.ps1(5.1 ではpowershell)は、1 つのセッションだけにポリシーを適用します。
実行ポリシーはスクリプトを誤って実行しないための安全装置であり、セキュリティ境界ではありません。スクリプトの内容をコンソールに貼り付ければ、誰でも実行できます。
Windows PowerShell 5.1 と PowerShell 7
- 2 つの別のプログラム:
powershell.exeは Windows PowerShell 5.1 で、Windows に組み込まれており、新機能の追加は終了しています。pwshは PowerShell 7 で、別途インストールするクロスプラットフォーム版です。2 つは共存できます。 - 7.0 で追加された演算子: コマンド間の
&&と||、三項演算子$a ? 'yes' : 'no'、null 合体演算子??/??=。 - ファイルのエンコード: 5.1 の
>とOut-Fileは UTF-16 LE で書き込み、Set-Contentは ANSI コードページを使います。PowerShell 7 はどこでも BOM なし UTF-8 で書き込み、Git、Linux のツール、多くのエディタが想定する形式と一致します。 - エイリアス: 7 では Windows で
curl、wget、scが廃止され、Linux/macOS ではls、cp、rm、cat、psなどをネイティブ コマンドに任せています(上の表を参照)。 - モジュールの違い:
Get-NetIPAddress、Test-NetConnection、Resolve-DnsNameのような Windows 専用のコマンドレットは、Windows の PowerShell 7 では動きますが、Linux や macOS にはありません。
Windows で bash を使う:WSL
Windows Subsystem for Linux(WSL)は本物の Linux ディストリビューションを Windows と並行して動かすため、右列の bash コマンドはすべてそのまま使えます。管理者権限のプロンプトで wsl --install を実行すると、デフォルトで Ubuntu と一緒にインストールされます(Windows 10 バージョン 2004 以降と Windows 11)。wsl -l -v でインストール済みのディストリビューションを一覧表示します。
- CMD や PowerShell から Linux コマンドを 1 つ実行:
wsl ls -la。パイプでつなぐこともできます:dir | wsl grep txt。 - Windows のドライブは Linux 内の
/mnt/c以下に表示されます。Linux のファイルにはエクスプローラーの\\wsl.localhost\Ubuntu(古いビルドでは\\wsl$\Ubuntu)からアクセスできます。 - プロジェクトは /mnt/c ではなく Linux のファイルシステム(~/)内に置きましょう。境界をまたぐファイルアクセスはかなり遅くなります。
Linux 側の詳細は Linux コマンド早見表をご覧ください。
不具合や改善できそうな点を見つけましたか?いただいたメッセージはすべて読み、すぐに対応します。
この CMD・PowerShell・Bash 対応表は、同じ作業を Windows のコマンドプロンプト、PowerShell、bash で 1 行に並べて示します。ファイルの一覧表示とコピー、ファイル内のテキスト検索(grep に相当する PowerShell のコマンドは Select-String)、環境変数、プロセス、ネットワーク、サービス、ファイル内容の読み書き、そして変数・条件分岐・ループ・関数を使ったスクリプトまで扱います。3 つのシェルのどれかのコマンドで検索すると、他のシェルでの対応コマンドがコピーボタン付きで表示されます。
シェルを行き来するときによくつまずく点も取り上げています。Unix のコマンドに見えて実は違う PowerShell のエイリアス(Windows PowerShell 5.1 の curl と wget、Windows ではどのバージョンでも ls と rm)、引用符とエスケープ文字の違い、.ps1 スクリプトをブロックする実行ポリシーのエラー、Windows PowerShell 5.1 と PowerShell 7 の違いです。注記がない限り、PowerShell のコマンドはどちらのバージョンでも動きます。CMD に相当するコマンドがない場合は、無理に作り出さず、ないと明記しています。
使い方
- 知っているコマンドを、どのシェルのものでも検索するか(例:「grep」「findstr」「Select-String」)、作業内容で検索します(「プロセスを終了」「環境変数」)。
- 行を横に読んで他の 2 つのシェルでの対応コマンドを確認し、必要なものの横にある「コピー」をクリックします。
- 作業名の下の注記を確認します。バージョンの違い(PowerShell 5.1 と 7)や Windows 専用のコマンドレットを示しています。
- コマンドが予想と違う動きをしたら、エイリアス、引用符、実行ポリシーのセクションまでスクロールします。
- 手元に置く用には「印刷 / PDF として保存」を使います。スマートフォンでも使え、各行がカードとして表示されます。
よくある質問
grep に相当する PowerShell のコマンドは?
Select-String です。ファイルを検索するには Select-String -Path app.log -Pattern error、コマンドの出力を絞り込むには ipconfig | Select-String IPv4 とします。初期設定では大文字と小文字を区別せず(区別するには -CaseSensitive を追加)、.NET の正規表現を使い、-NotMatch が grep -v に相当します。再帰的に検索するには、Get-ChildItem -Recurse -Filter *.log を Select-String にパイプします。短いエイリアスは sls です。
PowerShell で curl の動きがおかしいのはなぜですか?
Windows PowerShell 5.1 では curl と wget が Invoke-WebRequest のエイリアスになっているため、-X、-H、-d などの curl のオプションが拒否されたり、別の意味になったりします。Windows 10 1803 以降に付属する本物の curl を実行するには curl.exe と入力してください。PowerShell 7 ではこれらのエイリアスが削除されたので、curl で curl.exe が実行されます。Linux や macOS では、curl がエイリアスだったことはありません。
PowerShell は CMD より優れていますか?
プログラムや短いバッチファイルを実行する以上のことをするなら、そうです。PowerShell はテキストではなく構造化されたオブジェクトをパイプで渡すので、列を解析する代わりにプロパティ名で絞り込みや並べ替え(Where-Object、Sort-Object)ができ、本格的な関数、エラー処理、JSON や CSV への対応、リモート操作も備えています。CMD も古い .bat ファイルや一部のインストーラーには今でも十分で、CMD のツール(ipconfig、robocopy、netstat)はすべて PowerShell からも実行できます。
「このシステムではスクリプトの実行が無効になっている」エラーを解決するには?
これは実行ポリシーによるもので、Windows 10 と 11 のクライアントエディションでは初期設定が Restricted です。PowerShell で Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser を実行してください(管理者権限は不要)。これで自分のスクリプトは実行でき、インターネットからダウンロードしたスクリプトは署名済みであるか、Unblock-File でブロックを解除する必要があります。Get-ExecutionPolicy -List でどのスコープに何が設定されているかを確認できます。グループポリシーの設定は、自分で設定した内容より優先されます。
Windows で bash コマンドを実行できますか?
はい、Windows Subsystem for Linux(WSL)を使えばできます。管理者として開いたプロンプトで wsl --install を実行すると(Windows 10 バージョン 2004 以降または Windows 11)Ubuntu がインストールされます。その後はスタートメニューから開くか、CMD や PowerShell から wsl に続けてコマンドを入力すれば、wsl grep -rn TODO のように単発のコマンドを実行できます。Git for Windows にも、一般的な Unix ツールを備えた軽量な bash である Git Bash が含まれています。
Windows PowerShell と PowerShell 7 の違いは何ですか?
Windows PowerShell 5.1(powershell.exe)は Windows に組み込まれており、修正が提供されるだけです。PowerShell 7(pwsh)は現行のクロスプラットフォーム版で、Windows、Linux、macOS で動き、別途インストールします。両方を同時にインストールできます。バージョン 7 では、コマンド間の && と ||、三項演算子と ?? 演算子が追加され、ファイルの書き込みが初期設定で UTF-8 になり、curl や wget のような紛らわしいエイリアスが一部削除されています。
オブジェクトかテキストか:PowerShell が腑に落ちる唯一の考え方
CMD や bash では、パイプが運ぶのはテキストです。bash でメモリを最も使っているプロセスを調べるには、ps の出力から sort -k や awk で正しい列を取り出す必要があり、列の配置が変わるとコマンドは壊れます。PowerShell では、パイプが名前付きのプロパティを持つオブジェクトを運ぶので、同じ作業は Get-Process | Sort-Object WS -Descending | Select-Object -First 1 になります。解析は一切不要で、プロパティ名はどのマシンでも同じです。
実際には、調べ方そのものが変わります。bash では出力形式を知るために man ページを読みますが、PowerShell ではどのコマンドでも Get-Member にパイプすれば、そのオブジェクトが持つプロパティとメソッドがわかり、Where-Object で絞り込み、Select-Object で項目を選べます。PowerShell が出力をテキストに変えるのは、画面やファイルに届いたときだけです。
ipconfig、git、curl.exe などのネイティブプログラムは PowerShell でもテキストを出力するので、grep と同じように Select-String や -match が使えます。これらの終了コードは $? ではなく $LASTEXITCODE に入ります。
3 つのシェル間でスクリプトを書き換える
単純なスクリプトなら 1 行ずつ書き換えれば済みますが、ほぼ誰もがつまずく違いがいくつかあります。
• 比較演算子:CMD は文字列に ==、数値に EQU、GTR、LSS を使います。PowerShell は -eq、-gt、-lt、-like、-match を使います(単独の > はリダイレクト)。bash は文字列には [ ] の中で =、数値には -gt または (( )) を使います。
• 変数:CMD は %name%(setlocal EnableDelayedExpansion の後のループ内では !name!)、PowerShell は $name、bash は $name で、代入時は = の前後にスペースを入れません。
• .bat ファイル内のループではパーセント記号を 2 つ重ねます。ファイル内では for %%f in (*.txt)、プロンプトでは for %f です。
• パス:Windows の PowerShell は / と \ の両方を受け付けますが、Linux の bash には / が必要です。環境変数は Windows では大文字と小文字を区別せず、Linux では区別します。
• エラー:CMD は %ERRORLEVEL% を確認しない限り失敗後も続行し、bash は set -e がない限り続行し、PowerShell は $ErrorActionPreference = 'Stop' でない限り、終了しないエラーの後も続行します。
Windows と Linux の両方で動かす必要があるスクリプトなら、PowerShell 7 か WSL 上の bash を使えば、2 つのバージョンを管理せずに済みます。
関連する無料ツール
- Linux コマンド早見表 — ファイルと権限からネットワーク、systemd、テキスト処理まで、用途別の Linux コマンド。すべての項目にオプション、コピーできる例、macOS での注意点付き。
- Windows ショートカットキー — Windows 11 のショートカットを 1 つの検索・印刷できる一覧に:Windows キー、スナップ、仮想デスクトップ、スクリーンショット、エクスプローラー。
- Mac キーボードショートカット — ⌘ ⌥ ⌃ ⇧ の記号の意味から、スクリーンショット、ウインドウのタイル表示、Finder、Safari、特殊文字まで、macOS のショートカットを網羅しました。
- curl コード変換 — Chrome の「Copy as cURL」を含む curl コマンドを貼り付けると、同じリクエストを Python、JavaScript、Node、Go、PHP、Ruby、Java、C#、wget、HTTPie のコードにします。
- Git 早見表 — 直前のコミットの取り消し、ブランチ名の変更、リモートブランチの削除など、やりたいこと別に整理した Git コマンド。新しい switch/restore と従来のコマンド、危険度バッジ付き。