覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Windows - curlコマンド

Windows 10 は、標準でcurlコマンドが使えるようになってたんですね。(知らなかったです)

Windows標準のcurlについて、少しだけ確認してみました。


Wndows PowerShell 5.1

デフォルトでインストールされている Wndows PowerShell 5.1 環境で curl と実行してみたら以下のようになりました

PS C:\Users> curl

コマンド パイプライン位置 1 のコマンドレット Invoke-WebRequest
次のパラメーターに値を指定してください:
Uri:

何か思ってたのと違うので、よくよく確認してみたら
curl というコマンドは Invoke-WebRequest の Alias になってました。(以下の通り)

PS C:\Users> Get-Command curl

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


PS C:\Users> Get-Command Invoke-WebRequest

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Invoke-WebRequest                                  3.1.0.0    Microsoft.PowerShell.Utility


ただし、実際には上記の curl とは関係なく、 curl.exe というものが標準でインストールされています。
curl.exe とやれば実行できます。(こっちのほうが想定してた curlコマンドに近いと思われます)

PS C:\Users> curl.exe
curl: try 'curl --help' for more information
PS C:\Users> Get-Command curl.exe

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     curl.exe                                           7.55.1.0   C:\WINDOWS\system32\curl.exe


PowerShell 7.1

標準の Windows PowerShell とは別で PowerShell 7.1 もインストールしているので、
そちらでも curlコマンドを確認してみました。今回確認した環境の情報(バージョン等)は以下の通りです。

PS C:\Users> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.1.3
PSEdition                      Core
GitCommitId                    7.1.3
OS                             Microsoft Windows 10.0.19042
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0


curlについて確認した結果は以下の通りです。

PS C:\Users> curl
curl: try 'curl --help' for more information
PS C:\Users> Get-Command curl

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     curl.exe                                           7.55.1.0   C:\WINDOWS\system32\curl.exe

こっちは最初から curlcurl.exe を指してます。(もしかしたら環境にもよるかもしれませんが)


ついでに curl --version も実行してみました。

PS C:\Users> curl --version
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: 2017-11-14, security patched: 2019-11-05
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL


話は、それますが DOSプロンプトでも curlcurl.exeC:\WINDOWS\system32\curl.exe) を指しています。


WSL

WSL (Ubuntu 20.04.2 LTS) での curl もついでに確認。

user01@PC-001:/mnt/c/Users$ curl
curl: try 'curl --help' or 'curl --manual' for more information
user01@PC-001:/mnt/c/Users$ which curl
/usr/bin/curl
user01@PC-001:/mnt/c/Users$ curl --version
curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3
Release-Date: 2020-01-08
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets

Windows版標準のcurl.exeとは バージョン、扱えるプロトコル、機能 に差異があるようです。


まとめ・補足

  • curl と安易に実行しても、実行環境によって curl.exeだったり、そうでなかったりしています。
  • curl.exe は Windows用にビルドされた curl のためか、Linux上のcurlとは扱えるプロトコルやパラメータに差異があります。
  • (実行例が無いので分かりにくいですが) curl.exeでも、Linux用にビルドされているcurlとほぼ同じ操作ができます。


HTTPステータスコードだけ取得

以前書いたこのエントリをWindows標準のcurl.exeで実現する場合は以下のようになります。

curl -s {リクエスト先のURL} -o nul -w '%{http_code}\n'

上記は PowerShell 7.1 で実行する想定です。