2013-04-05 33 views
1

好吧,我有这个数组,它本质上是一个CSV文件的Import-Csv。数组中的每个对象都是整个CSV行。输入文件呈现正常,当我打开它用Excel(列是正确的)尝试使用powershell将数组导出到csv(数组对象是;分隔符并包含换行符)

这个CSV文件是逗号分隔,在下面的示例中的格式:

“第一”,“第二”,“这是所有

第三

柱”,‘第四’

我已经得到了我的脚本一切工作正常,除了FO r我需要将这个数组写入一个.csv文件的部分,格式正确。我一直有问题使用Out-FileExport-Csv,我甚至尝试过this,但它并没有给我正是我需要的东西。每个对象需要在csv文件中成为新行,只出现一次,并且必须遵守Excel的CSV文件呈现(即每列需要双引号和逗号分隔)。

我甚如此绝望,我想手动格式化这个事情正确地做这个:

$Array | % { $_ -replace "`"@`{","`n`"" } | % { $_ -replace "}`"","`"`n" } | % { $_ -replace "`;","`"`;`"" } | % { $_ -replace "Plugin ID=","" } | % { $_ -replace "CVE=","" } | % { $_ -replace "CVSS=","" } | % { $_ -replace "Risk=","" } | % { $_ -replace "Host=","" } | % { $_ -replace "Protocol=","" } | % { $_ -replace "Port=","" } | % { $_ -replace "Name=","" } | % { $_ -replace "Synopsis=","" } | % { $_ -replace "Solution=","" } | % { $_ -replace "Description=","" } | % { $_ -replace "Plugin Output=","" } | % { $_ -replace "`";`"","`",`"" } | Out-File "$dirResults\$Results-$Time.csv"  

从本质上讲,我在这里做的几件事情:

  • 从每个对象的末尾删除@ {从开始和}
  • 将分隔符从;于,
  • 将每列在双引号
  • 卸下的columnHeader =从每个值

这里的开头是一个代码段:

$arrayHeader = @("Plugin ID;CVE;CVSS;Risk;Host;Protocol;Port;Name;Synopsis;Description;Solution;Plugin Output") 
$OutterArrayException = Import-Csv "$dirExceptions\$FileException" -Delimiter "," 
$InnerArrayScanMe = New-Object System.Collections.ArrayList 
# This method keeps the arrays separate types 
FOREACH ($Object in $OutterArrayScanMe) 
     { $InnerArrayScanMe.Add("$Object") | Out-Null } 
# Note that the OutterArrayException is an Import-Csv from a similarly formatted file as OutterArrayScanMe 
FOREACH ($Exception in $OutterArrayException) 
     { $InnerArrayScanMe.Remove("$Exception") } 
# This method keeps the arrays separate types 
$OutterArrayScanMe = @($arrayHeader) + @($InnerArrayScanMe) 
$OutterArrayScanMe | Export-Csv "$dirResults\$FileScanMe-$startTime.csv" -Delimiter ";" -NoTypeInformation 

UPDATE
当我使用export-csv时,对象的新行将信息作为csv中的新行。因此,应该看起来像这样的东西变得非常混乱。

UPDATE2
已经有什么格式的样子,这些问题都与格式什么的一些问题。为了解决这些问题,我在数组中包含了一个单独的对象来说明问题。请记住,在我的脚本中会发生什么是一个格式正确的CSV(具有多行等,并完美呈现)的import-csv,删除不必要的对象(使用$ array.Remove),然后转储到文件Out-File或Export-Csv)。如此简单,但这样的破碎...

例Array对象(OUT-文件):
@ {插件ID = #####; CVE = CVE - #### - ####; CVSS = ##。风险=中;主机= ### ### ### ###。。。;协议= XXX;端口= ##;名称= Microsoft ASP.NET xxx;概要=远程网络服务器使用的一个框架,其漏洞为
。;说明=在远程主机上运行的Web服务器似乎正在使用ASP.NET,并且可能受到漏洞的影响。

此外,有推测称,这个漏洞可能导致独角兽和彩虹 如果与物理访问机器 塞在一个攻击者;解决方案=使用魔术过滤器阻止淘气网站的请求。

hxxp://###.###.###.###/xxx/xxxxxxxxx
插件输出= Nessus的通过请求
以下网址接收的顽皮页或相关的错误消息}

例Array对象(出口-CSV):
#TYPE System.String
“长度”
“616”

+1

什么是错的当你使用export-csv时它重新排列的方式? – mjolinor 2013-04-05 20:38:11

+0

在Excel 2013中将其另存为CSV时,将以“;”分隔不是“,”和文本不总是在引号中(实际上从来没有当我尝试)。上面的示例是什么?它是“input.csv”吗?那么你修改它,导出它,并希望保持相同的格式(每行对象多行),或者你想删除换行符?请提供输出csv的示例。 – 2013-04-05 21:03:29

+0

“第一”,“第二”,“这是全部 第三 列”,“第四” 是否所有新行? – 2013-04-06 03:20:40

回答

0

的问题是在脚本中,在该步骤:

$InnerArrayScanMe = New-Object System.Collections.ArrayList 
# This method keeps the arrays separate types 
FOREACH ($Object in $OutterArrayScanMe) 
     { $InnerArrayScanMe.Add("$Object") | Out-Null } 

的$ InnerArrayScanMe成功添加对象从正常数组$ OutterArrayScanMe,而不更改数组类型,但是因为它被放入.NET数组中,所以数据格式不正确。

这样做的最初方式是让我可以使用.NET数组的.Add和.Remove方法。通过索引中删除的解决方法,这样我们就不会需要参考的对象看起来是这样的:

FOREACH ($Exception in $ArrayException) 
{ 
    $ArrayScanMe = $ArrayScanMe | Where-Object {"$_" -ne "$Exception"}; 
} 

这则允许我们做一个基本的出口-CSV

$ArrayScanMe | Export-Csv "$dirResults\$FileScanMe-$startTime.csv" -Delimiter "," -NoTypeInformation 
2

这个问题似乎是机智h你如何操作数组。检查了这一点:

Test.csv

"Age";"Name" 
12;"Test name" 
13;"My Other 
test" 

脚本

$Array = Import-Csv .\test.csv -Delimiter ";" 

#$Array.Remove() is NOT a valid method. An array is of fixed size, and you will get an exception 
#Instead, create a new array of items that are filtered through your rules. 
#My test rule is only kids who are not 12 years old 
$Newarray = $Array | Where-Object { $_.Age -ne "12" } 

$Newarray | Export-Csv .\out.csv -Delimiter ";" -NoTypeInformation 

Out.csv

"Age";"Name" 
"13";"My Other 
test" 

一切就像是应该的。

请勿在对象上使用-replace。它会将对象转换为字符串,并且您将获得您在update2中提供的输出。例如:

$Array = Import-Csv .\test.csv -Delimiter ";" 

$Array -replace "`r`n" | Export-Csv .\out2.csv -Delimiter ";" 
$Array -replace "`r`n" | Out-File out2.txt 

Out2.csv

#TYPE System.String 
"Length" 
"25" 
"28" 

“类型” 部分只是因为你没有用Export-CSV

指定-NoTypeInformation Out2.txt

@{Age=12; Name=Test name} 
@{Age=13; Name=My Othertest} 

顺便说一句,Out-File不是导出对象的方式,但仍然在之后你的对象的数组成了一个字符串数组,如输出Out2.txt

编辑$OutterArrayScanMe = @($arrayHeader) + @($InnerArrayScanMe)这是你的问题。你将两个数组合并在一起。新数组中的第一个对象将是一个字符串对象。 Export-CSV将第一个对象的属性用作每个对象的标题。由于第一个对象是一个字符串(仅限Length属性),因此所有对象将仅以Length属性导出。

如前所述,Export-CSV使用对象属性作为标题(除非您指定另一个标题定义,如| Select Age, Name | Export-Csv)。所以,如果是$InnerArrayScanMe对象的数组具有相同属性,只需使用:

$InnerArrayScanMe | Export-Csv "$dirResults\$FileScanMe-$startTime.csv" -Delimiter ";" -NoTypeInformation 

Export-CSV将自行找出标题。总结:不要将你的标题字符串添加到数组中。如果您需要orneed排除一些属性特定的顺序,你可以用传递一个字符串数组select-object定义标题,比如:

$arrayHeader = @("Plugin ID","CVE","CVSS","Risk","Host","Protocol","Port","Name","Synopsis","Description","Solution","Plugin Output") 

$arrlist | Select-Object -Property $arrayHeader | 
Export-Csv "$dirResults\$FileScanMe-$startTime.csv" -Delimiter ";" -NoTypeInformation 
+0

使用Excel时,只要格式正确,显示多行字段似乎没有问题。我不想删除换行符,我只是想确保当换行符处于CSV格式时,它的格式将使Excel将其识别为单个条目。 – JZeolla 2013-04-07 11:56:53

+0

要么我有一个“愚蠢的一天”,或者你没有足够好地解释它。如果您在我的“答案”(以';'而不是',')开放第一个样本,这是在csv中提供多行值的“正确方法”,那么它将在Excel中正确读取。但是,您必须调整行高才能看到所有文本。那是你要的吗?为了让Excel理解它需要延展? – 2013-04-07 12:04:59

+0

请参阅update2,这应该提供更多的清晰度。 – JZeolla 2013-04-08 15:04:00

1

不知道理解你的问题,你可以做到以下几点:

Import-Csv C:\temp\nessus.csv | where {$_.risk -eq "high"} 
Import-Csv C:\temp\nessus.csv | where {$_.risk -eq "high"} | select host -Unique 

您可以用Excel

Import-Csv C:\temp\nessus.csv | where {"high","medium","low" -contains $_.risk} | select "Plugin ID", CVE, CVSS, Risk, Host, Protocol, Port, Name | Export-Csv 'c:\temp\nessusExcel.csv' -Delimiter ';' 

您可以在GridView显示它导出为CSV编辑:

Import-Csv C:\temp\nessus.csv | where {"high","medium","low" -contains $_.risk} | select "Plugin ID", CVE, CVSS, Risk, Host, Protocol, Port, Name | Out-GridView 

导出到HTM文件:

Import-Csv C:\temp\nessus.csv | where {"high","medium","low" -contains $_.risk} | select "Plugin ID", CVE, CVSS, Risk, Host, Protocol, Port, Name | ConvertTo-Html -As List > report.html 
+0

如果我不清楚,我很抱歉;该脚本导入一个csv,然后对其进行处理,将其与其他文件进行比较,解析条目等。此时,我有一个“最终数组”,我希望以一种很好的格式输出到一个文件中。我的问题是,在输出阶段,格式很乱,因为它似乎要在数组中的每个对象周围添加@ {},并且不能正确引用多行条目以便正确解析。输入的格式是正确的,格式不是在数组中手动​​更改的。看来,PowerShell稍微改变了这种格式(见子弹)。 – JZeolla 2013-04-07 12:00:34

+0

你可以举一个'$ Array'的例子,例如在带有'Export-Clixml'的xml文件中? – JPBlanc 2013-04-07 19:24:17

+0

请参阅我的update2,让我知道这是否给你你正在寻找的东西。我做了一个Export-Clixml并提供了一个模糊的单行(有多个条目格式完全相同)。我显然删除了。 – JZeolla 2013-04-08 15:00:44

相关问题