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
看到这一点。我们还看到从 [PSCustomObject
到 Json
的转换也留下了很多麻烦。
为了解决这个问题,我们应该使用 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
作为
$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
看到这一点。我们还看到从 [PSCustomObject
到 Json
的转换也留下了很多麻烦。
为了解决这个问题,我们应该使用 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