PowerShell新手问题:如何执行包含@符号的命令?
解决PowerShell中执行带@符号的curl命令报错问题
这个问题的核心是PowerShell对@符号有特殊语法含义(用于Splatting参数传递),你直接把DOS里的curl命令用字符串包裹后通过iex执行时,PowerShell会把@somejson_ok.json当成自己的语法解析,而不是原样传给curl程序,所以才会触发报错。
给你几个可行的解决办法:
方法1:直接调用真正的curl程序(推荐)
PowerShell里默认的curl是Invoke-WebRequest的别名,并非你在DOS中使用的原生curl程序。你可以直接用curl.exe明确调用系统里的curl,这样参数里的@会被正确传递给curl,不会被PowerShell解析:
curl.exe --ntlm -d @somejson_ok.json --header "Content-Type: application/json" -u : -X POST http://localhost/someaction
方法2:转义@符号后再用iex执行
如果你一定要通过字符串+iex的方式执行,需要用PowerShell的转义字符(反引号`)把@转义,同时字符串里的双引号也要转义:
$command = "curl.exe --ntlm -d `@somejson_ok.json --header `"Content-Type: application/json`" -u : -X POST http://localhost/someaction" iex $command Read-Host "Done"
方法3:使用Here-String定义命令
Here-String可以让你直接编写原始格式的命令,不需要转义双引号和@,写法更直观:
$command = @" curl.exe --ntlm -d @somejson_ok.json --header "Content-Type: application/json" -u : -X POST http://localhost/someaction "@ iex $command Read-Host "Done"
总结来说,方法1是最稳妥的选择,直接调用curl.exe能避开PowerShell的别名和语法解析问题,操作简单不易出错。
内容的提问来源于stack exchange,提问作者yonexbat
相关产品推荐
相关产品推荐

