[英]Powershell export-csv return numbers
我无法理解为什么我的csv导出仅返回数字而不是我想要的字符串。 当我使用文件外但不使用export-csv时,一切看起来都不错。
$get_child_csv = Get-ChildItem $c_path -ErrorVariable +errors | ?{ $_.PSIsContainer } | select fullname | foreach {$_.fullname} | Export-Csv ".\childitems\csv\$item.csv" -NoTypeInformation -Encoding unicode
$get_child_txt = Get-ChildItem $c_path -ErrorVariable +errors_txt | ?{ $_.PSIsContainer } | select fullname | foreach { $_.fullname } | Out-File ".\childitems\txt\$item.txt"
CSV输出示例:
Length
41
41
41
41
TXT输出:
\\SERVER\FILESHARE\FOLDER
\\SERVER\FILESHARE\FOLDER
\\SERVER\FILESHARE\FOLDER
\\SERVER\FILESHARE\FOLDER
我究竟做错了什么?
Export-CSV
用于导出具有多个属性的对象。 输出的格式是每行一个对象,第一行是标题,描述下面ex。的行的列/属性:
Property1,Property2
11,12
21,22
您正在尝试导出FullName
-property的字符串值,因为foreach { $_.FullName } | Export-CSV ...
的以下代码 foreach { $_.FullName } | Export-CSV ...
字符串对象只有一个属性“ Length”,如下所示,这就是为什么CSV仅包含Length标头和每个路径的长度(每行一个)的原因:
PS > Get-ChildItem | foreach {$_.fullname} | Get-Member -MemberType Properties
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Length Property int Length {get;}
如果只想保存路径(单个属性/值),则不应使用Export-CSV
,而应使用Out-File
, Set-Content
来创建普通文本文件:
Get-ChildItem $c_path | ?{ $_.PSIsContainer } | foreach { $_.fullname } | Out-File ".\childitems\txt\$item.txt"
如果要使用有效的CSV(需要标头),则可以删除foreach {$_.fullname} |
获得此输出:
PS > Get-ChildItem $c_path -ErrorVariable +errors | ?{ $_.PSIsContainer } | select fullname | Export-Csv ".\childitems\csv\$item.csv" -NoTypeInformation -Encoding unicode
FullName
Path1
Path2
旁注:您可以将对象转换为CSV,跳过第一行(标题),然后使用Out-File
等进行保存。如下面的示例所示,获取无标题的csv文件,但实际上没有理由将CSV用于每个对象的单个属性/列/值。
PS > gci | select fullname | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1
"C:\Users\frode\3D Objects"
"C:\Users\frode\Contacts"
"C:\Users\frode\Desktop"
回答
Frode F.正确地解释了为什么它无法按预期方式工作,但是有一种简单的方法来获取字符串数组并将其从管道中放入CSV:
'first','second','third' |
ForEach-Object {New-Object psobject -Property @{'String' = $_}} |
Export-Csv ".\string_example.csv" -NoTypeInformation
如果您希望将此零件作为管道中的一个衬套重复使用:
%{New-Object psobject -Prop @{$propName=$_}}
(只需要提前定义$ propName或将$ propName替换为字符串即可)
说明
通过使用ForEach{New-Object}
,我们获取数组中的每个字符串,并显式创建一个具有命名属性的对象,该属性的值是管道中的字符串。
回顾Frode F.所说的, Export-Csv
将从传递的对象中获取Properties。 如果要比较原始方式的属性成员与ForEach{New-Object}
的属性成员,请尝试以下代码:
$stringArray = 'first','second','third'
# Original
$stringArray |
Get-Member -MemberType Properties
# With ForEach{New-Object}
$stringArray |
ForEach-Object {New-Object psobject -prop @{'String' = $_}} |
Get-Member -MemberType Properties
结果如下:
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Length Property int Length {get;}
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
String NoteProperty System.String String=first
Export-Csv将使用“名称”字段中的条目作为标题,而使用“定义”部分作为内容。 请注意,“定义”字段列出了将通过ForEach{New-Object}
方法传递的原始和字符串中的int类型的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.