PowerShell System.Object []数组Export-CSV

时间:2016-11-01 16:23:57

标签: 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 linke中看到的那样,它调用来自它的web请求应该是一个文件类型列表;导入FSRM以打击勒索软件。

我在Select-Object页面中没有看到关于选择你可以返回的内容的内容,所以我缺少什么?

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

2 个答案:

答案 0 :(得分:1)

尝试像这样修改

  $path = "c:\temp\"
  $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 |%{ $_.filters}  | select @{ N="Value";E={$_.ToString()}} | Export-Csv -Delimiter ";" -NoTypeInformation -Path ($path + $ts + ".csv")

答案 1 :(得分:1)

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