命令在cmd提示符下工作但在Powershell中没有,我做错了什么?

时间:2016-12-12 22:20:37

标签: php windows powershell curl cmd

因此,我整天都在为这个问题撕掉我的头发。我有一个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工作。

有人能帮忙吗?

谢谢

1 个答案:

答案 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

请注意,这根本没有经过测试,但应该是一个很好的起点。