CMD・PowerShell・Bash コマンド対応表

同じ作業をコマンドプロンプト、PowerShell、bash で横に並べて比較。ファイル、grep、環境変数、プロセス、ネットワーク、サービス、スクリプトまで。

CMD・PowerShell・Bash 比較 · freetoolsforweb.com/tools/cmd-vs-powershell-vs-bash · 2026-10-18 確認

最終確認日:2026-10-18、Microsoft Learn の PowerShell 7.6 / Windows PowerShell 5.1 リファレンス、Windows コマンド リファレンス、GNU Bash 5.2 マニュアル で確認。

9 グループ、107 件のタスク(エイリアス、クォート、ポリシーの解説付き)

ファイルとフォルダー

やりたいことCMD(コマンド プロンプト)PowerShellBash(Linux/macOS)
ファイルを一覧表示 #
PowerShell のエイリアス:gci、dir、Windows では ls。
dir
Get-ChildItem
ls -l
隠しファイルも含めて一覧表示 #
dir /a
Get-ChildItem -Force
ls -la
すべてのファイルを再帰的に一覧表示 #
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 は 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(コマンド プロンプト)PowerShellBash(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 行 #組み込みコマンドなし
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

環境変数

やりたいことCMD(コマンド プロンプト)PowerShellBash(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(コマンド プロンプト)PowerShellBash(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(コマンド プロンプト)PowerShellBash(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(コマンド プロンプト)PowerShellBash(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(コマンド プロンプト)PowerShellBash(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(コマンド プロンプト)PowerShellBash(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.1Windows の PowerShell 7Linux/macOS の PowerShell 7
curl
5.1 で本物の curl を使うには curl.exe と入力します。curl のフラグ(-X、-H、-d)は Invoke-WebRequest では意味を持ちません。
Invoke-WebRequestエイリアスではない:curl.exe を実行ネイティブの curl
wget
Invoke-WebRequest url -OutFile name か、curl.exe -LO url を使います。
Invoke-WebRequestエイリアスではない(Windows にはデフォルトで wget なし)ネイティブの wget(インストール済みの場合)
ls, dir
ls -la のようなフラグは Windows では失敗します。Get-ChildItem -Force を使います。
Get-ChildItemGet-ChildItemls = ネイティブの ls、dir = Get-ChildItem
cat, typeGet-ContentGet-Contentcat = ネイティブの cat、type = Get-Content
cp, mv, rm, rmdir
rm -rf は PowerShell では無効です。Remove-Item -Recurse -Force を使います。
Copy-Item, Move-Item, Remove-Item同じコマンドレットネイティブ コマンド
ps, killGet-Process, Stop-Process同じコマンドレットネイティブ コマンド
sort, tee, diff
Windows の PowerShell で diff a b を実行すると、2 つのファイルの行ではなくオブジェクトを比較します。
Sort-Object, Tee-Object, Compare-Object同じコマンドレットネイティブ コマンド
sc
5.1 で sc query を実行すると、query という名前のファイルが作られます。sc.exe を使います。
Set-Contentエイリアスではない:sc.exe を実行なし
where
プログラムを探すには where.exe か Get-Command を使います。
Where-ObjectWhere-ObjectWhere-Object
echo
echo -n では改行を抑制できません。Write-Host -NoNewline を使います。
Write-OutputWrite-OutputWrite-Output
manhelphelpネイティブの man

クォートとエスケープ

「あるシェルでは動くのに別のシェルでは失敗する」バグの多くは、クォートが原因です。エスケープ文字はシェルごとに異なります。

項目CMDPowerShellBash
リテラル文字列(展開なし)リテラル用の引用符なし:%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 に相当するコマンドがない場合は、無理に作り出さず、ないと明記しています。

使い方

  1. 知っているコマンドを、どのシェルのものでも検索するか(例:「grep」「findstr」「Select-String」)、作業内容で検索します(「プロセスを終了」「環境変数」)。
  2. 行を横に読んで他の 2 つのシェルでの対応コマンドを確認し、必要なものの横にある「コピー」をクリックします。
  3. 作業名の下の注記を確認します。バージョンの違い(PowerShell 5.1 と 7)や Windows 専用のコマンドレットを示しています。
  4. コマンドが予想と違う動きをしたら、エイリアス、引用符、実行ポリシーのセクションまでスクロールします。
  5. 手元に置く用には「印刷 / 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 と従来のコマンド、危険度バッジ付き。