我有从 powershell 运行的代码。当我在没有导出 csv 的情况下运行它时,我会在屏幕上看到所有文件夹名称。
dir | select -expand fullname | % { ($_ -split '\')[7]
但是如果我添加
| export-csv c:\test.txt
,那么我会在文件中看到以下内容,而不是我期望的文件夹名称,就像我在屏幕上看到的那样。
#TYPE System.String
"Length"
"13"
"18"
"20"
"22"
"29"
"21"
"24"
"11"
"17"
"20"
"20"
Export-Csv
导出对象属性及其值的表。由于您的脚本正在生成字符串对象,并且它们唯一的属性是长度,所以这就是您所得到的。
如果您只想保存列表,请使用
Out-File
或 Set-Content
而不是 Export-Csv
。
前面的答案确实有效,但如果有人希望将其输出到 CSV 文件中怎么办?
这不工作:
$str_list = @('Mark','Henry','John')
$str_list | Export-Csv .\ExportStrList.csv -NoType
因为
Export-Csv
接受对象并输出属性。 String[ ] 的唯一属性是长度,因此 CSV 文件仅包含长度。
为了解决这个问题,我们需要将 String[ ] 更改为 Object[ ]。最简单的方法是使用
Select-Object
。$str_list = @('Mark','Henry','John')
$obj_list = $str_list | Select-Object @{Name='Name';Expression={$_}}
$obj_list | Export-Csv .\ExportStrList.csv -NoType
重申一下,
Select-Object
输出一个可以轻松操作的自定义 PSObject。这是非常强大的信息,请明智地使用它。
这对我有用:
$data = @()
$row = New-Object PSObject
$row | Add-Member -MemberType NoteProperty -Name "name1" -Value "Test"
$row | Add-Member -MemberType NoteProperty -Name "name2" -Value 2
$data += $row
$data | Export-Csv "Text.csv" -NoTypeInformation
这是处理此问题的另一种方法:
定义主数组列表
$MASTER_ARRAY_LIST = [System.Collections.ArrayList]@()
定义输出文件名
$OutputFilename="C:\TEMP\MyOutputFile.csv"
ForEach ( $Something in $List_of_Somethings) {
$CURRENT_RECORD_DETAILS = New-Object PSObject -Property @{'name'=$($Something.Name);'fullname'=$($Something.FullName);'id'=$($Something.ID)}
$MASTER_ARRAY_LIST.Add( $CURRENT_RECORD_DETAILS ) > $null
}
$MASTER_ARRAY_LIST.ToArray() | Select-Object -Property name,fullname,id | Export-Csv -Path $OutputFilename -NoTypeInformation
$test = @("test1","test2","test3")
$test | export-csv "firstTry.csv"
#We see that this fails. So here is how to to do it with the desired results
foreach ($item in $test) {
[ pscustomobject]@{ ResultColumn = $item } | Export-Csv -Path ./secondTry.csv -NoTypeInformation -Append
}
对于任何其他偶然发现此问题的人,最简单的解决方案是从
中删除“-expand”dir | select -expand fullname | % { ($_ -split '\')[7]
其他答案中提到的“-expand”从全名字段中删除了属性标头,因此现在只有一个长度属性 - 不再是全名属性。因此,export-csv 会导出长度,因为它是唯一剩余的属性。
$output |Select-Object * | Export-Csv 'h:\filename.csv' -NoTypeInformation