WindowsでLinux Likeなcurlを使う方法

PowerShellのcurlとcurl.exeの挙動の違いを示す図。 PowerShell
「curl」と入力すると、システムに存在するcurl.exeよりもPowerShellのInvoke-WebRequestエイリアスが優先される

最初に抑えておくべきWindows curlの基本

  • PowerShellでは、単にcurlと実行するとInvoke-WebRequestのエイリアス(別名)として動作する。
  • Linux標準のcurlと同じ挙動をさせたい場合は、拡張子.exeを付加して実行する必要がある。
  • ソースコードは同じだが、OSのビルド環境に起因する機能(Features)の差がある。(例:対応プロトコルやSSL/TLSバックエンド)

Windows標準でcurlは使えるのか?

 Web通信のテストや、Web APIを実行する際、Linuxではよくcurlコマンドが利用される。

 一方、WindowsでHTTPリクエストを送信するコマンドを調べると、PowerShellのInvoke-WebRequestコマンドや、Invoke-RestMethodコマンドがヒットする。しかし、curlに慣れているLinuxユーザーにとっては、PowerShellコマンドは取っ付き難い。
 例えば、LinuxのcurlではHTTPレスポンスをそのまま標準出力しているのに対して、Invoke-WebRequestではBasicHtmlWebResponseObjectというPowerShellが整形したオブジェクトが返却される。もちろんコマンドオプションも違う。

 ここでcurlに慣れ親しんだユーザーにも朗報で、実はWindowでもWindows 10 Version 1803 (RS4)以降であれば、curlを標準で利用することができる。ただし注意点があるので後述する。

PowerShellにおける「curl」と「curl.exe」の違い

 早速、Windowsでcurlを使ってみる。しかし、結果を見るとLinuxのcurlのような出力形式ではない。

PS > curl https://www.madogiwa-engineer.com


StatusCode        : 200
StatusDescription : OK
Content           : <!doctype html>
                    <html lang="ja">

### 以下省略 ###

 この理由は、curlInvoke-WebRequestのAliasとなっており、実際にはInvoke-WebRequestを実行しているからである。

PS > Get-Alias curl

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           curl -> Invoke-WebRequest

 Linux Likeなcurlを利用するには、拡張子.exeを付加したcurl.exeを実行する必要がある。

PS > curl.exe -s https://www.madogiwa-engineer.com | Select-Object -First 10
<!doctype html>
<html lang="ja">

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta name="format-detection" content="telephone=no">

【補足】 
 PowerShellがコマンドを解釈する際、実行パスの検索(Path環境変数のチェック)よりもエイリアスのチェックが先に実行される。このため、curlと入力すると、システムに存在するC:\Windows\System32\curl.exeよりも、エイリアスであるInvoke-WebRequestが優先的に実行される。
 コマンドプロンプト(cmd.exe)では、PowerShellのようなエイリアス設定がデフォルトでされていないため、curlまたはcurl.exeのどちらを実行しても、環境変数のPath経由でC:\Windows\System32\curl.exeが実行される

LinuxのcurlとWindowsのcurlに差はあるのか?

 curlのソースコードはLinux/Windowsともに同じものを利用しているため、いずれのcurlも近い機能を有している。ただし、ビルドが異なるため、依存ライブラリや対応しているProtocolFeaturesが異なるので注意が必要である。それぞれ--versionオプションで確認できる。

◆Ubuntu24.04

$ curl --version
curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 (+libidn2/2.3.7) libssh/0.10.6/openssl/zlib nghttp2/1.59.0 librtmp/2.3 OpenLDAP/2.6.7
Release-Date: 2023-12-06, security patched: 8.5.0-2ubuntu10.6
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd

◆PowerShell

PS > curl.exe --version
curl 8.16.0 (Windows) libcurl/8.16.0 Schannel zlib/1.3.1 WinIDN
Release-Date: 2025-09-10
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSockets

 具体例を挙げると、Windowsのcurl(8.16.0 (Windows))は、nghttp2ライブラリを含んでおらず、Featuresを見るとHTTP/2に対応していない。そのため、--http2オプションを使用してもエラーとなる。

PS > curl.exe --http2 https://www.madogiwa-engineer.com
curl: option --http2: the installed libcurl version does not support this
curl: try 'curl --help' for more information

 一方で、Ubuntuのcurl(8.5.0 (x86_64-pc-linux-gnu))はHTTP2に対応しているため、サイト側が対応していれば、HTTP/2を使った通信が可能だ。

$ curl --http2 -sI https://www.madogiwa-engineer.com | head -1
HTTP/2 200

 その他の差分を以下に挙げるが、curl自身の差分ではなく、OSやシェルに起因するものである。

  • TLS/SSLのバックエンドの差(Linuxは主にOpenSSL、Windowsはschannel)によって、対応しているCipher SuiteやTLSバージョンに差が出る。
  • OS依存で改行コード(CRLF/LF)や文字コードの扱いが異なることがある
  • シェルの違いでクォートの扱いが異なる

Windowsでcurlを使うための3つの選択肢

 Windows環境でLinux Likeなcurlを利用する方法をまとめると、主に以下の3つの選択肢に分類できる。 

解決方法主な利点注意点
Windows標準のcurlを利用追加の環境構築が不要高度な機能(HTTP/2など)が使えない
WSLやDocker等でLinux環境を準備Linux curlの機能をそのまま利用できるWindowsとLinuxを跨いだ操作が必要になることがある
libcurlをカスタムビルドWindowsネイティブで高度な機能を使える環境構築や依存ライブラリのメンテナンス難易度が高い

 もしも、LinuxとWindowsのcurlの機能差分が気になるのであれば、WSLやDocker等でLinux環境を準備するのが良い。ただし、一般的なWeb APIテストやデータ取得といった利用用途であれば、Windowsのcurl.exeでもほとんど不満なく利用できるだろう。

 どうしてもWindows環境のみでLinux curlと同等なFeaturesのcurlを使いたい場合は、libcurlを手動でビルドする選択肢もある。
 以下にvcpkg(C/C++ライブラリのパッケージマネージャー)を利用した、カスタムビルドの大まかな手順を記載する。

  1. 環境構築GitVisual Studio(C++ワークロード付き)をインストール
  2. vcpkgのセットアップ:vcpkgをクローンし、初期ビルドを行う(今回の例ではC:\dev配下にvcpkgをクローンする)
PS > cd C:\dev
PS > git clone https://github.com/microsoft/vcpkg
PS > cd C:\dev\vcpkg
PS > .\bootstrap-vcpkg.bat
  1. curlのビルド:依存ライブラリを指定し、curlをインストール(今回の例ではOpenSSLとHTTP/2を有効化)
PS > .\vcpkg install curl[openssl,http2,tool]:x64-windows
  1. 動作確認:ビルドしたcurl.exeが以下のパスに格納される。
C:\dev\vcpkg\installed\x64-windows\tools\curl\curl.exe

 格納されているパスまで移動し、--versionオプションで機能を確認すると、OpenSSLnghttp2が依存ライブラリがインストールされていることがわかる。

PS > cd C:\dev\vcpkg\installed\x64-windows\tools\curl
PS > .\curl.exe --version
curl 8.17.0-DEV (Windows) libcurl/8.17.0-DEV OpenSSL/3.6.0 (Schannel) zlib/1.3.1 nghttp2/1.68.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM SPNEGO SSL SSPI threadsafe TLS-SRP Unicode UnixSockets

 また、--http2オプションでHTTP/2通信ができていることも確認できる。

PS > .\curl.exe -ksI --http2 https://www.madogiwa-engineer.com
HTTP/2 200
### 以下省略 ###

 このカスタムビルドする方法であれば、Windows標準版では対応していないHTTP/2通信などが可能になる。ただし、環境構築やメンテナンスの難易度は高いので注意が必要だ。

【補足】
 本稿ではvcpkgを利用してビルドしたが、nmakeでbuildする方法cmakeでbuildする方法もある。

参考サイト

Windows 10“バージョン 1803”(RS4)はコマンドラインも充実? 搭載予定機能のまとめ/Linuxとの親和性はますます高まる。コマンドラインでも扱えるUWPアプリも今後登場?【やじうまの杜】
“やじうまの杜”では、ニュース・レビューにこだわらない幅広い話題をお伝えします。
curl shipped by Microsoft

タイトルとURLをコピーしました