LoginSignup
9
9

More than 3 years have passed since last update.

PowerShell でcurlを使いたい。JSONをエスケープせずに。

Last updated at Posted at 2020-07-22

今までcurlのためだけにWSLのUbuntuを起動するということをやっていたのですが、最近発見した方法がこちら。

  1. PowerShell 7.x をインストールする。
  2. PowerShell 7.x 上でcurlを実行する。
  3. POSTリクエストを投げる時は、JSONボディ全体をダブルクォートでくくり、中身の引用符にシングルクォートを使う。

PowerShell 7.xをインストールするとcurlを実行できる理由

  • Windows10の1803以降では、標準でcurlコマンドがインストールされており、コマンドプロンプトを使えば普通にcurlが使えます。
  • しかしながら、個人的にコマンドプロンプトは好きじゃないので、PowerShellを使いたい。
  • しかしWindowsに標準インストールされているPowerShell (2020/7/22現在のバージョンは5.1)でcurlを呼ぶと、Invoke-WebRequest というコマンドが実行されてしまいます。curlがInvoke-WebRequestのエイリアスになっているためです。1
  • そこで、Windows標準インストール版PowerShellの後継版(7.x)を利用します。こちらはクロスプラットフォーム化された後継版です。2
  • この後継版(以下pwsh)では、Invoke-WebRequestへのエイリアスが削除されています。

ちなみに PowerShell 7.x のインストール方法ですが、Microsoftの説明を参照してください。とは言ってもGitHubからmsiファイルをダウンロードして実行するだけです。
普通にインストールしても、PowerShell 5.1を上書きしたりはしないので大丈夫です。
今回は本日2020/7/22時点でのLTS最新版、7.0.3を使いました。

alias を削除するという方法もあるみたいですが、PCを引っ越したりしたときに忘れそうなので、今回は別の方法で試しました。

(2020/7/23追記)コメントで指摘いただきましたが、PowerShell 5.1でも"curl"ではなく"curl.exe"と書くだけで Invoke-WebRequestのエイリアスを回避できます。

JSONボディの送り方

PowerShell上でcurlを使う際、POSTでJSONデータを送りたいことがあります。Linuxでやるように

-d '{"query": "hogehoge"}'

と書くと、"BadArgument"と怒られてしまいます。
Windows 環境における curl コマンド利用のまとめ (平成最終版)によると、どうやら下記のようにエスケープする必要があるようです。

-d '"{\"query\": \"hogehoge\"}"'

……面倒ですね。面倒だと思ったので、単純に中身をシングルクォートにしてみました。つまりこうです。

-d "{'query': 'hogehoge'}"

動きます。
RFCによると、JSONの文字列は本来ダブルクォートでくくる必要があるらしいのですが、通ります。
少なくとも私がテストしたサーバーでは通りました。
個人的にcurlを使うのはちょっとしたテストだけなので、当面これで行こうと思います。

上記で動かないサイトがあったらどうする?

ごーばっくとぅー WSL


  1. 単純なGetならともかく、-H も -X も使えない仕様にしたの、なんでなん……? 

  2. PowerShell Coreとも呼ばれているようですが、PowerShell Core だったのは 6.x 系だけで、最近正式リリースされた 7.x系では単純に「PowerShell」と呼ばれているようです。Microsoftの説明のページにて「PowerShell Core」ではなく「PowerShell」と書かれているのを見て、私もちょっと混乱しました。 

9
9
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9