$path = "\\path\to\folder"
$ts = (Get-Date -format yyyyMMdd_HHmmss)
Invoke-WebRequest -Uri "https://fsrm.experiant.ca/api/v1/combined" -UseBasicParsing -OutFile ($path + $ts + ".json")
$json = Get-Content -Raw ($path + $ts + ".json")
$x = $json | ConvertFrom-Json
$x | Select filters | Export-Csv -NoTypeInformation -Path ($path + $ts + ".csv")
上面的输出为:
filters
System.Object[]
将脚本的最后一行更改为:
$x | Select-Object -ExpandProperty filters | Export-Csv -NoTypeInformation -Path ($path + $ts + ".csv")
给我一些类似于下面的内容,即每个项目的长度计数:
Length
6
6
6
6
7
...
我不需要长度,我想要实际值,正如您从 .json 链接中看到的那样,它调用的 Web 请求应该是文件类型列表;导入 FSRM 以对抗勒索软件。
我在“选择对象”页面中没有看到任何有关选择可以返回的内容的信息,那么我错过了什么?
最佳答案
Invoke-RestMethod
包括从 JSON 转换响应,而 Invoke-WebRequest
则没有,因此这里使用它是一个有用的 cmdlet。
.filters
是一个字符串列表。您可以将它们放入一个文件中,每行一个,使用:
$filters = (Invoke-RestMethod -Uri https://fsrm.experiant.ca/api/v1/combined).filters
$filters | Set-Content "d:\path\$(get-date -Format u).csv"
如果确实需要列标题行:
$Path = "d:\path\$(get-date -Format u).csv"
$filters = (Invoke-RestMethod -Uri https://fsrm.experiant.ca/api/v1/combined).filters
'Filter' | Set-Content $Path
$filters | Add-Content $Path
如果确实需要通过 CSV,它将引用每一行并有一个标题行,那么:
$path = "d:\temp"
$ts = (Get-Date -format yyyyMMdd_HHmmss)
$json = Invoke-RestMethod -Uri "https://fsrm.experiant.ca/api/v1/combined"
$json.filters | select @{N="Value";E={$_}} | Export-Csv -NoTypeInformation -Path "$path\$ts.csv"
不需要|%{$_.Filters}
,因为只有一个从 JSON 转换而来的对象,并且过滤器是它的一个属性,因此访问它一次:
{
filters: [
]
}
并且不需要E={$_.ToString()}
,因为过滤器值已经是字符串。
Import-CSV 和 Export-CSV 的工作方式是:
- 行是一个对象
- 列映射到对象的属性
- CSV 映射到对象数组
Select
允许您从通过管道传入的一些对象开始,然后将它们沿着管道发送,仅包含您选择的某些属性。
计算属性允许您动态添加新属性到通过管道的对象。
在这种情况下:
$json.filters |
传入的是字符串。
$json.filters | select @{Name="Value";Expression={$_}}
正在使用一个字符串
"*.vbs"
并将其转换为具有一个属性的 PSCustomObject:
@{Value="*.vbs"}
现在映射到 CSV 行,其中包含一列(“值”)和列内容 *.vbs
。
管道变成
@{Value="*.vbs"}
@{Value="*.exe"}
@{Value="*.js"}
和Export-CSV
将它们处理成CSV
关于PowerShell System.Object[] 数组导出-CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40364230/