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
- □ ×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>curl https://example.com
<!doctype html>
<html>
…
C:\users\user>
curl が使えるか確認する

where curl を実行すると C:\Windows\System32\curl.exe のようにパスが表示されます。curl --version でバージョンも確認できます。見つからない場合は、Windows 10 のバージョン 1803 より前の可能性があります。Git for Windows などが入っていると、別の curl が先に表示されることもあります。where については

を参照してください。

PowerShell では curl.exe と入力する

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 と併用すると、エラーが起きたときだけメッセージを表示する
-fHTTP 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
- □ ×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>curl -I https://example.com
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1256
…
C:\users\user>
おすすめ書籍※ 広告を含む場合があります
中小企業経営者のためのRPA入門 RPA導入を成功させる方法

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

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

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

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

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

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかる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
`-X POST` は省略できる

-d を指定した時点でメソッドは POST になるため、-X POST は省略できます。PUT や DELETE など別のメソッドを使うときに -X PUT のように指定します。

日本語を含む JSON はファイルで渡す

コマンドプロンプトに直接日本語を書いた場合、コードページの影響で文字化けした状態で送信されることがあります。日本語を含むデータは、UTF-8 で保存したファイルを -d @data.json で渡すと確実です。詳しくは

を参照してください。

HTTP ステータスコードを取得する(-w)

-w(write-out)を使うと、通信結果に関する情報を出力できます。%{http_code} は HTTP ステータスコードです。

curl -s -o NUL -w "%{http_code}" https://example.com
- □ ×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>curl -s -o NUL -w "%{http_code}" https://example.com
200
C:\users\user>

-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 が含まれるため、保存時の文字コードによっては文字化けします。対処法は

を参照してください。

URL に & が含まれる場合は引用符で囲む

?a=1&b=2 のように URL に & が含まれると、コマンドプロンプトが & をコマンドの区切りと解釈してしまいます。URL は必ずダブルクォートで囲んでください。なお、バッチファイル内で URL に %20 のようなパーセントエンコードがある場合は、%%20 と書く必要があります。

証明書エラーを無視する -k について

-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

関連記事

練習問題

練習問題

短縮 URL のようにリダイレクトされる URL で、転送先まで追いかけて取得したいとき、付けるオプションはどれでしょうか?

回答がサーバーに送信されることはありません
練習問題

HTTP 404 などのエラー応答のとき、エラーページをファイルに保存せずエラー終了にしたい場合に使うオプションはどれでしょうか?

回答がサーバーに送信されることはありません
#コマンドプロンプト #バッチファイル #コマンドライン #コマンド #curl #ネットワーク #ダウンロード