【发布时间】:2013-03-28 09:10:51
【问题描述】:
好的,我有这个数组,它本质上是一个 CSV 文件的Import-Csv。数组中的每个对象都是一个完整的 CSV 行。当我用 Excel 打开它时,输入文件正确呈现(列是正确的)
此 CSV 文件以逗号分隔,格式如下:
"第一","第二","就这些
第三个
列","第四"
我已经让脚本中的所有内容都能正常工作,除了我需要将此数组以可以正确呈现的格式写入 .csv 文件的部分。我在使用Out-File、Export-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=
这是一段sn-p代码:
$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
更新:
当我使用 export-csv 时,对象的新行将信息作为新行放置在 csv 中。因此,应该看起来像这样的东西变得非常混乱。
UPDATE2:
关于格式是什么样的以及格式存在什么问题,一直存在一些问题。为了清除这些,我在数组中包含了一个对象来演示该问题。请记住,在我的脚本中发生的情况是有一个格式正确的 CSV 的 import-csv(具有多行等,并且可以完美呈现),删除不必要的对象(使用 $array.Remove),然后转储到文件( Out-File 或 Export-Csv)。如此简单,却又如此破碎……
示例数组对象(输出文件):
@{插件ID=#####; CVE=CVE-####-####; CVSS=#.#;风险=中等;主机=###.###.###.###;协议=xxx;端口=##;名称=Microsoft ASP.NET xxx;概要=远程 Web 服务器使用的框架
脆弱性。描述=远程主机上运行的 Web 服务器似乎正在使用 Microsoft
ASP.NET,并且可能受漏洞影响。
此外,有人猜测此漏洞可能会导致
如果攻击者可以物理访问机器,则在独角兽和彩虹中
插入。解决方案=使用魔法过滤器阻止对淘气网站的请求。;插件输出=
Nessus 通过请求
收到了一个顽皮的页面或相关的错误消息
以下网址:
hxxp://###.###.###.###/xxx/xxxxxxxxx
}
示例数组对象(导出-Csv):
#TYPE System.String
“长度”
“616”
【问题讨论】:
-
您使用 export-csv 时的渲染方式有什么问题?
-
在 Excel 2013 中另存为 CSV 时,用“;”分隔不是“,”并且文本并不总是用引号引起来(实际上我尝试时从来没有)。上面的样本是什么?是“input.csv”吗?然后你修改它,导出它并希望保持相同的格式(每个对象多行),或者你想删除换行符?请提供输出 csv 的样本。
-
"first","second","this is all the third column","fourth" 都是新行吗?
-
请举例说明您要导出到 CSV 文件的内容。
-
@mjolinor 查看更新。
标签: powershell scripting