curl - Web からデータを取得・送信する
curl コマンドは、コマンドプロンプトから Web サーバーと HTTP / HTTPS で通信するためのコマンドです。Web ページやファイルのダウンロード、Web API の呼び出し、HTTP ステータスコードの確認などをブラウザを使わずに行えます。
Windows 10 のバージョン 1803 以降と Windows 11 には curl.exe が標準で入っているため、追加のインストールなしで使えます。
curl コマンドの基本構文
curl [オプション] URL
オプションを付けずに URL だけを指定すると、サーバーから返ってきた内容をそのままコンソールに表示します。
curl https://example.com
where curl を実行すると C:\Windows\System32\curl.exe のようにパスが表示されます。curl --version でバージョンも確認できます。見つからない場合は、Windows 10 のバージョン 1803 より前の可能性があります。Git for Windows などが入っていると、別の curl が先に表示されることもあります。where については
Windows PowerShell 5.1 では curl が Invoke-WebRequest コマンドレットのエイリアス(別名)になっており、オプションの書き方も結果も本記事と異なります。PowerShell 7 以降ではこのエイリアスはありませんが、curl.exe と拡張子まで入力すればバージョンによらず本物の curl を使えます。引用符の書き方も PowerShell では異なります。コマンドプロンプトではこの問題はありません。
ファイルとして保存する(-o / -O)
ダウンロードした内容をファイルに保存するには、-o で保存先を指定します。
curl -o page.html https://example.com
URL 末尾のファイル名をそのまま使いたい場合は、大文字の -O を使います。
curl -O https://example.com/files/report.pdf
この例では、カレントディレクトリに report.pdf が保存されます。保存先を確認するときは
-o や -O で保存するとき、同じ名前のファイルが既にあると警告なしに上書きされます。重要なファイルがあるフォルダで実行する場合は、保存先のパスを明示してください。
リダイレクト先を追いかける(-L)
短縮 URL やダウンロード用 URL は、別の URL へ転送(リダイレクト)されることがあります。curl は既定では転送先に移動しないため、転送先まで取得したい場合は -L を付けます。
curl -L -o setup.zip https://example.com/download/latest
進捗表示とエラー表示を調整する(-s / -S / -f)
curl はダウンロード中に進捗メーターを表示します。バッチファイルのログをきれいにしたいときは、次のオプションを組み合わせます。
| オプション | 説明 |
|---|---|
-s | 進捗メーターとエラーメッセージを表示しない(silent) |
-S | -s と併用すると、エラーが起きたときだけメッセージを表示する |
-f | HTTP 404 や 500 などのエラー応答のとき、本文を保存せずエラー終了にする |
-f を付けないと、404 エラーのページ(エラーを説明する HTML)が成功したかのようにファイルへ保存されます。スクリプトでは -fsSL の組み合わせがよく使われます。
curl -fsSL -o setup.zip https://example.com/download/latest
HTTP ヘッダーだけを確認する(-I)
-I を付けると、本文は取得せずに HTTP ヘッダー(ステータスや更新日時など)だけを表示します。
curl -I https://example.com

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超 入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
サイトが応答しているかどうか、ファイルのサイズがどれくらいかを、ダウンロードせずに確認できます。表示される内容はサーバーによって異なります。
Web API を呼び出す(-H / -d / -X)
ヘッダーを付けて GET する(-H)
-H で任意の HTTP ヘッダーを追加できます。API トークンの送信などに使います。
curl -H "Authorization: Bearer %API_TOKEN%" https://api.example.com/v1/items
トークンをコマンドに直接書くと、コマンド履歴や画面共有で漏れるおそれがあります。この例のように環境変数に入れて参照するのがおすすめです。環境変数については
を参照してください。データを POST する(-d)
-d でデータを指定すると、メソッドが自動的に POST になります。JSON を送る場合は Content-Type ヘッダーも付けます。
curl -X POST -H "Content-Type: application/json" -d "{\"name\":\"sample\",\"count\":3}" https://api.example.com/v1/items
コマンドプロンプトでは文字列を囲めるのはダブルクォート " だけです。そのため、JSON 内のダブルクォートは \" とエスケープします。
JSON が長くなる場合は、ファイルに保存して @ファイル名 で読み込ませると、エスケープの手間と書き間違いを避けられます。
curl -X POST -H "Content-Type: application/json" -d @data.json https://api.example.com/v1/items
-d を指定した時点でメソッドは POST になるため、-X POST は省略できます。PUT や DELETE など別のメソッドを使うときに -X PUT のように指定します。
コマンドプロンプトに直接日本語を書いた場合、コードページの影響で文字化けした状態で送信されることがあります。日本語を含むデータは、UTF-8 で保存したファイルを -d @data.json で渡すと確実です。詳しくは
HTTP ステータスコードを取得する(-w)
-w(write-out)を使うと、通信結果に関する情報を出力できます。%{http_code} は HTTP ステータスコードです。
curl -s -o NUL -w "%{http_code}" https://example.com
-o NUL は本文を捨てる指定です(NUL は書き込んだ内容を破棄する特殊なデバイス名です)。
バッチファイルの中では % が特別な意味を持つため、-w "%{http_code}" は -w "%%{http_code}" と書く必要があります。コマンドプロンプトに直接入力するときは % 1 つで構いません。
タイムアウトとリトライを設定する
ネットワークが不安定な環境では、待ち時間と再試行回数を決めておくと処理が止まりません。
| オプション | 説明 |
|---|---|
--max-time 秒 | 全体の処理時間の上限 |
--connect-timeout 秒 | 接続確立までの待ち時間の上限 |
--retry 回数 | 一時的なエラーのときに再試行する回数 |
curl -fsSL --connect-timeout 10 --max-time 60 --retry 3 -o setup.zip https://example.com/download/latest
実践例:ダウンロードの成否を判定する
curl は成功すると終了コード 0 を返し、失敗すると 0 以外を返します。-f と組み合わせると、404 などの HTTP エラーも失敗として扱えます。
@echo off
setlocal
set "url=https://example.com/files/report.pdf"
set "dest=%USERPROFILE%\Downloads\report.pdf"
curl -fsSL --retry 3 -o "%dest%" "%url%"
if errorlevel 1 (
echo ダウンロードに失敗しました。
exit /b 1
)
echo ダウンロードが完了しました: "%dest%"
endlocal
終了コードの扱いは
で解説しています。なお、-f を付けた状態で HTTP エラーになると、curl は終了コード 22 を返します。
このスクリプトには日本語の echo が含まれるため、保存時の文字コードによっては文字化けします。対処法は
?a=1&b=2 のように URL に & が含まれると、コマンドプロンプトが & をコマンドの区切りと解釈してしまいます。URL は必ずダブルクォートで囲んでください。なお、バッチファイル内で URL に %20 のようなパーセントエンコードがある場合は、%%20 と書く必要があります。
-k を付けると HTTPS の証明書検証をスキップできますが、通信が盗聴・改ざんされても気づけなくなります。社内の検証環境など、リスクを理解した場合に限って使い、通常は付けないでください。
まとめ
| やりたいこと | コマンド例 |
|---|---|
| 内容を画面に表示 | curl URL |
| ファイル名を指定して保存 | curl -o 保存名 URL |
| URL のファイル名で保存 | curl -O URL |
| リダイレクトを追う | curl -L URL |
| ヘッダーだけ確認 | curl -I URL |
| JSON を送信 | curl -H "Content-Type: application/json" -d "..." URL |
| ステータスコード取得 | curl -s -o NUL -w "%{http_code}" URL |