因此,我整天都在为这个问题撕掉我的头发。我有一个curl命令,我在Windows机器上工作,从Cloudflare中提取日志,这是有效的。
curl -sv -o logname.log.gz -X GET -H "Accept-encoding: gzip" -H "X-Auth-Email: myemail@email.com" -H "X-Auth-Key: 12345" "https://api.cloudflare.com/client/v4/zones/987654/logs/requests?start=1481509909&end=1481538709"
我试图将其导入PowerShell,其最终目标是根据当前时间使开始和结束时间参数不同,但是我根本无法让命令在PowerShell中运行,我已经尝试了各种不同的曲目,这是最新,最简单的。
cmd.exe /c 'curl -sv -o logname.log.gz -X GET -H "Accept-encoding: gzip" -H "X-Auth-Email: myemail@email.com" -H "X-Auth-Key: 12345" "https://api.cloudflare.com/client/v4/zones/987654/logs/requests?start=1481509909&end=1481538709"'
这给了我这个错误
{ [11971 bytes data]
* Failed writing body (0 != 11963)
* Failed writing data
* Curl_http_done: called premature == 1
* Closing connection 0
* schannel: shutting down SSL/TLS connection with api.cloudflare.com port 443
* schannel: clear security context handle
我已经知道我的unix时间戳有点偏,并计划在接下来修复,但我无法理解的是为什么同一命令通过命令提示符而不是通过Powershell工作。
有人能帮忙吗?
谢谢
答案 0 :(得分:1)
在PowerShell中处理本机命令的参数可能是一个雷区,因为你必须处理两者的引号和特殊字符,有时是嵌套的。
在PowerShell中使用Start-Process
并为其提供一系列参数可能更安全:
Start-Process curl.exe -ArgumentList '-sv','-o','logname.log.gz','-X','GET','-H','Accept-encoding: gzip','-H','X-Auth-Email:','myemail@email.com','-H','X-Auth-Key:','12345','https://api.cloudflare.com/client/v4/zones/987654/logs/requests?start=1481509909&end=1481538709'
但你真正应该做的是检查Invoke-WebRequest
,这最终会更容易。
$body = @{
start = 1481509909
end = 1481538709
}
$headers = @{
'Accept-Encoding' = 'gzip'
'X-Auth-Email' = 'myemail@email.com'
'X-Auth-Key' = '12345'
}
$response = Invoke-WebRequest -Uri 'https://api.cloudflare.com/client/v4/zones/987654/logs/requests' -OutFile logname.log.gz -Body $body -Headers $headers
请注意,这根本没有经过测试,但应该是一个很好的起点。