繁体   English   中英

Powershell export-csv返回编号

[英]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-FileSet-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM