PowerShell System.Object[] 数组导出-CSV

标签 powershell csv

$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 以对抗勒索软件。

我在“选择对象”页面中没有看到任何有关选择可以返回的内容的信息,那么我错过了什么?

https://technet.microsoft.com/en-us/library/hh849895.aspx

最佳答案

Invoke-RestMethod 包括从 JSON 转换响应,而 Invoke-WebRequest 则没有,因此这里使用它是一个有用的 cmdlet。

该网站的 JSON 输出中的

.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/

相关文章:

python - 如何从 zip 文件夹中的 csv 文件读取数据并将 csv 文件中的数据保存到数据库中?

javascript - 如何警告 Angular ui 网格导入文件失败?

regex - 使用每个文件中的特定字符串重命名目录中的多个文件

powershell - 杀死从远程计算机上给定路径运行的多个进程

c# - 在 PowerShell 中隐式转换为 C# 中定义的结构的 bool 失败

windows - 在cmd中合并多个csv文件

javascript - 有没有一种方便的方法可以在不转换的情况下从 CSV 文件将值打印到 JS 图表?

powershell - 使用 powershell 远程处理安装 Windows 10 应用程序

powershell - 创建一行包含 4 个值的变量

python - 使用python删除多个csv文件的前2行