Get-content 不生成 Invoke-restmethod 可以处理的数组

Get-content not producing an array that Invoke-restmethod can process

作为 的后续,我没有在脚本中使用长数组,而是想从文本文件中提取。所以我替换了这个:

$URLs = 'http://websiteone.com','http://websitetwo.com','http://websitethree.com'

有了这个

$URLs = 获取内容 ./urlfile.txt

或(据我所知功能相同)这个

$URLs = @(Get-Content ./urlfile.txt)

但我最终得到 Invoke-RestMethod:远程服务器返回错误:(400) 错误请求。

结合我上一个问题的精彩回复,我的 foreach 循环如下所示:

foreach($URL in $URLs) {
    $BODY = @([pscustomobject]@{"client" = @{"clientId" = "company"; "clientVersion" = "1.0"}; "threatInfo" = @{"threatTypes" = "MALWARE","SOCIAL_ENGINEERING","THREAT_TYPE_UNSPECIFIED","UNWANTED_SOFTWARE","POTENTIALLY_HARMFUL_APPLICATION"; "platformTypes" = "ANY_PLATFORM"; "threatEntryTypes" = "URL","EXECUTABLE","THREAT_ENTRY_TYPE_UNSPECIFIED"; "threatEntries" = @{"url" = $URL}}})
    $JSONBODY = $BODY | ConvertTo-Json
    $Result = Invoke-RestMethod -Method 'POST' -Uri $Uri -Body $JSONBODY -Headers $HEADERS
    if ( ([string]::IsNullOrEmpty($Result)) ) {} else {write-host $URL "ALERT: Safe browsing match!"}
}

... 但如果我使用 Get-Content cmdlet 创建数组,这将不起作用。如果我 运行 脚本,然后键入 $URLs,我会得到完全相同的返回数据。我在获取内容方面做错了什么?

Invoke-RestMethod cmdlet 可以一次发出一个 Rest 请求,不能使用数组。

您将需要添加一个 forEach 循环来逐步执行您的 $urls 一个,如下所示:

foreach($url in $urls){

    $result = Invoke-RestMethod -Uri $url 
    #do something with $result
}

因此,要将上一个问题的样本整合到您的示例中,您应该有一个如下所示的 urls.txt 文件:

http://google.com
http://small.com
https://fast.com/

然后您的代码将如下所示:

$URLs = get-content .\urls.txt
$HEADERS = @{ 'Content-Type' = "application/json" }
$GOOGLE_API_KEY='[API Key]'
$Uri = 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key='+ $GOOGLE_API_KEY

foreach($URL in $URLs) {
    $BODY = @([pscustomobject]@{"client" = @{"clientId" = "company"; "clientVersion" = "1.0"}; "threatInfo" = @{"threatTypes" = "MALWARE","SOCIAL_ENGINEERING","THREAT_TYPE_UNSPECIFIED","UNWANTED_SOFTWARE","POTENTIALLY_HARMFUL_APPLICATION"; "platformTypes" = "ANY_PLATFORM"; "threatEntryTypes" = "URL"; "threatEntries" = @{"url" = $URL}}})
    $JSONBODY = $BODY | ConvertTo-Json
    $result = Invoke-RestMethod -Method 'POST' -Uri $Uri -Body $JSONBODY -Headers $HEADERS

    [pscustomObject]@{SiteName=$url;ThreatInfo=$result.Matches}
}

这将从您的文本文件加载 $urls 的列表,然后 运行 对每个列表加载一个 Rest 请求,将结果存储在 $result 中。最后,它将使用站点名称创建一个新的 PowerShell 对象,并显示 Google SafeBrowsing API 中是否有任何匹配项。

您需要以交互方式 运行 命令并查看 $result 中的哪些属性对您有意义,但您可以在 Google API 文档。

编辑

发现错误。事实证明,当我们使用 Get-Content 时,返回的对象保留了原始文件中的一些文档格式信息!我们可以通过检查 $JSONBODY 看到这一点。我们还看到从 [PSCustomObjectJson 的转换也留下了很多麻烦。

为了解决这个问题,我们应该使用 ToString() 方法将 $URL 转换为字符串,并且也将转换为 [psCustomObject],如下所示。

$BODY = @{
        "client" = @{
            "clientId" = "company"; "clientVersion" = "1.0"
            }; 
            "threatInfo" = @{
                "threatTypes" = "MALWARE",
                "SOCIAL_ENGINEERING",
                "THREAT_TYPE_UNSPECIFIED",
                "UNWANTED_SOFTWARE",
                "POTENTIALLY_HARMFUL_APPLICATION"; "platformTypes" = "ANY_PLATFORM"; "threatEntryTypes" = "URL"; "threatEntries" = @{
                    "url" = $URL.ToString()
                }
            }
        }
$JSONBODY = $BODY | ConvertTo-Json