🧑‍💻

windows powershellでcurlを使ったときにハマったこと

2023/10/20に公開

会社端末はwindowsを使用しており、私物端末はmacを使用しています。そのため、powershell固有の問題にハマってしまいました。

TL;DR

powershellでcurlコマンドを叩いたらエラーになりました。
その原因は、windows powershell上では curlがInvoke-WebRequest にエイリアスされていたためです。
そのため、エイリアスを削除すれば問題ありません。

社内のslack APIを叩こうとしたらエラーになった

社内で slack api proxyが使えるようになったので自分の端末から遊んでみようと思ったときの出来事です。
社内ドキュメントのサンプルを参考にpowershell上でcurlを実行したら、エラーになりました。

$ curl "https://sample.com/api/chat.postMessage" --data "channel=#times_ide" --data  "username=ide-test" --data "text=Hello" --data "link_names=true"
Invoke-WebRequest : 引数 '--data' を受け入れる位置指定パラメーターが見つかりません。
発生場所 行:1 文字:1
+ curl "https://sample.com/api/chat.postMessage ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest]、ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

curlでエラーになるのは違和感しかないので「powershell curl error」でググってみましたら、 Windows Powershellでcurlを使うときの注意点という記事が見つかりました。

curlがエイリアスされている

先程の記事を読み、curlコマンドがエイリアスされているということを知りました。
エイリアスを取得するためのコマンド Get-Aliasを使ってエイリアスを調べます。

$ Get-Alias -Definition Invoke-WebRequest

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

エイリアスされているということは、curlとしてInvoke-WebRequestが動くので、直接Invoke-WebRequestを使っても結果は同じです。
そこで、一旦Invoke-WebRequestコマンドで試してみました。

$ Invoke-WebRequest -Uri "https://sample.com/api/chat.postMessage" -Method POST -Body @{
>>     channel = "#times_ide"
>>     username = "ide-test"
>>     text = "Hello"
>>     link_names = "true"
>> }


StatusCode        : 200
StatusDescription : OK

当然ですが、Invoke-WebRequestでも正常に実行できることを確認できました。
ちなみに、Invoke-WebRequestの構文はこちらに載っています。

エイリアスを削除する

remove-itemコマンドを使ってエイリアスを削除します。
ただし、これを使ってエイリアスは削除できたものの、同一のセッション内でのみ有効である点に注意が必要です。
新しいウィンドウやシェルを立ち上げたらエイリアスが復活します。
この設定を永続化させるためには、設定ファイルを書く必要があるようです。

$ remove-item alias:curl
$ Get-Alias -Definition Invoke-WebRequest

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           iwr -> Invoke-WebRequest
Alias           wget -> Invoke-WebRequest

curlコマンドを実行する

curlコマンドのエイリアスが削除されている状態で、curlコマンドを実行します。
正常に動作することが確認できました。

$ curl "https://slack-api-proxy-group.linecorp.com/api/chat.postMessage" --data "channel=#times_ide" --data  "username=ide-test" --data "text=Hello" --data "link_names=true"

{"ok":true,"channel":"C05V4FMGNJ0","ts":"1697711339.009169",**********}

ちなみに実行後はこんな感じでメッセージがポストできました

Discussion