windows powershellでcurlを使ったときにハマったこと
会社端末は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