2016-01-23 34 views
2

我無法理解爲什麼我的csv導出只返回數字而不是我想要的字符串。當我使用out-file而不是export-csv時,一切看起來都不錯。Powershell 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 

我到底做錯了什麼?

+0

刪除'foreach {$ _。fullname}'。 – PetSerAl

+0

如果我這樣做,輸出將不會與txt文件相同。表格標題將顯示在頂部。 – David

+1

[PowerShell - 導出到CSV文件時出錯]的可能副本(http://stackoverflow.com/questions/34796291/powershell-trouble-exporting-to-csv-file) –

回答

3

Export-CSV用於導出具有多個屬性的對象。輸出的格式是每行一個對象與第一行是描述列的標題/下面例:

Property1,Property2 
11,12 
21,22 

行您正在嘗試導出字串值用於FullName -property的性質由於以下代碼foreach { $_.FullName } | Export-CSV ...。一個字符串對象只有一個屬性,它是「長度」,你可以看到下面的,這就是爲什麼你的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" 
1

ANSWER

弗羅德F.是正確的,解釋爲什麼沒有按預期工作,但有一個簡單的方法來抓住一個字符串數組,並將它們從拋出到CSV管:

'first','second','third' | 
    ForEach-Object {New-Object psobject -Property @{'String' = $_}} | 
    Export-Csv ".\string_example.csv" -NoTypeInformation 

如果你想這個部分重新作爲一個班輪在管:

%{New-Object psobject -Prop @{$propName=$_}} 

(只需要預先定義$屬性名稱或替換字符串$ PROPNAME)

說明

使用ForEach{New-Object},我們正在採取每個字符串數組中,並明確創建具有命名屬性的對象的值是管道中的字符串。

重溫Frode F.說,Export-Csv將會從它傳遞的對象中獲取屬性。如果你想的原始方式的屬性成員比較VS與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的標題,而「Definition」部分將用作內容。請注意,「定義」字段列出了將要傳遞的數據的類型 - 原始數據中的int和使用ForEach{New-Object}方法的字符串。

+0

我遇到過這個問題很多,因爲我傾向於使用'Select -Expand $ propName'從大對象中去除字符串。 –