如何在 PowerShell 中将 curl 结果作为变量获取

Posted

技术标签:

【中文标题】如何在 PowerShell 中将 curl 结果作为变量获取【英文标题】:How to get curl results as variable in PowerShell 【发布时间】:2018-12-27 15:25:36 【问题描述】:

使用 Powershell,我想运行以下命令并将 status_url 存储为变量。我无法直接引用status_url

$upload = curl.exe -u username:password -i -F filedata=@filename.csv https://sitename.com/csv

$upload 存储以下信息:

PS C:\Scripts> $上传 HTTP/2 200 内容类型:文本/html;字符集=utf-8 严格的传输安全:max-age=31536000;包括子域 内容安全策略: script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdnjs.cloudflare.com https://cdn.ravenjs.com https://cdn.mxpnl.com https://ssl.google-analytics.com http s://.googleapis.com https://cdn.segment.com https://d2yyd1h5u9mauk.cloudfront.net https://.typeform.com;connect-src 'self' https://api.mixpanel.com https://web.delighted.com https://a pi.segment.io;object-src 'self';style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://use.fontawesome.com https://fonts.gstatic.com https://fonts.googleapis.com;font-src ‘自我’https://cdnjs.cloudflare.comhttps://use.fontawesome.comhttps://fonts.gstatic.com; x-xss-保护:1;模式=块 x-content-type-options: nosniff 推荐人策略:严格来源 设置cookie:会话=d9337cbf2c313e12_5c24fe8c.Bg33P1e8TOQs9sDCpRWwOoSDDao;域=.rolepoint-qa.com;安全的;仅http;路径=/ x-云跟踪上下文:2586e15ea742ba3202516d6c9c58d3d2;o=1 日期:格林威治标准时间 2018 年 12 月 27 日星期四 16:32:12 服务器:谷歌前端 内容长度:94 到期:格林威治标准时间 2018 年 12 月 27 日星期四 16:32:12 缓存控制:私有

“结果”:“status_url”:“https://sitename.com/csv/v1/status/1234567”

如何仅引用 status_url 本身,以便在 GET 中使用它来检查上传状态?

输出是JSON,需要解析$upload还是有办法引用$upload.status_url

【问题讨论】:

($upload | ConvertFrom-Json).result.status_url 感谢您的帮助.. 收到此错误 PS C:\Scripts\rolepoint> ($upload|ConvertFrom-Json).result.status_url ConvertFrom-Json:无效的 JSON 原语:HTTP。在 line:1 char:10 + ($upload|ConvertFrom-Json).result.status_url + ~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [ConvertFrom-Json] , ArgumentException + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand 奇怪,这在 PSv5.1 中可以使用 ('"result": "status_url": "https://sitename.com/csv/v1/status/1234567"'|ConvertFrom-Json).result.status_url 你能检查一下 $upload 的类型($upload.gettype())吗?是字符串还是数组? PS > ($upload.gettype()) IsPublic IsSerial Name BaseType -------- -------- ---- --------真真对象[] System.Array 【参考方案1】:

我认为($upload | ConvertFrom-Json).result.status_url 由于 -i 参数而无法正常工作,它将响应正文与标头混合在一起,因此您没有获得有效的 json。删除它可以吗?如果您需要保留它,则可能使用 Invoke-Webrequest 代替。您可以尝试下面的代码(我无法测试)。如果它正常工作,那么只需浏览 $response 对象(响应正文将在 $response.Content 中)。

$password = ConvertTo-SecureString "yourpassword" -AsPlainText -Force
$user = "yourUser"

$params = @ 
 Uri = "https://sitename.com/csv"
 InFile = "path/to/your/file.csv"
 Method = "Post"
 Credential = [PSCredential]::new($user, $password)
 

$response = Invoke-Webrequest @params

您也可以尝试使用正则表达式从混合响应中提取该网址,例如:

$Upload -match 'https://sitename.com/csv/v1/status/\d*'
$Matches[0]

【讨论】:

删除 curl.exe 命令中的 -i 就可以了! $status_url = ($upload|ConvertFrom-Json).result.status_url 现在只包含状态 url。

以上是关于如何在 PowerShell 中将 curl 结果作为变量获取的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cacert 文件在 Powershell (Invoke-WebRequest) 中执行 cUrl 等效项?

PowerShell:如何在 PowerShell 中将数组对象转换为字符串?

如何在 PowerShell 中将 HashSet 转换为 ArrayList?

如何在 PowerShell 中将文件作为流逐行处理

如何在powershell中将变量放入文件名

如何在 PowerShell 中将计算值写入 SQL INSERT/UPDATE