2017-08-01 78 views
1

不,我無法使用Export-CSV。 =)將分隔符添加到Out-File

問題:如何在使用Out-File時添加自定義列分隔符?

原因:我基本上有一個多線程PowerShell腳本拉動信息導出到一個文件。使用Out-File的作品,因爲它不鎖定文件,並且不需要按順序。但是,我需要能夠最終在Excel中打開它。我的想法是以某種方式使用Out-File以特殊的分隔符導出數據,以便我可以在Excel中打開它。

我一直在研究超過一個小時,每一個類似的問題都被我的人解釋爲使用Export-CSV,這是我無法做到的。

有些事情我已經試過

foreach($item in $info){ 
New-Object -TypeName PSCustomObject -Property @{ 
FolderName = "$($item.Feature1) #" 
Owner = "$($item.Feature2) #" 
AccessRights = "$($item.Feature3) #" 
} | ft -hide | Out-File C:\Test.txt 

使用#作爲特殊的分隔符,但還有一百萬空行。

我也試過的事情類似:

| Select Feature1, Feature2, Feature3 | %{"$($_.Feature1)#", "$($_.Feature2)#", $_.Feature3} | out-file C:\Test.txt -Force -Append 

但是經過和擴大了我不想擴展性能。

如果這不是最好的方式去做這件事,我肯定會對有用和可行的建議開放!

在此先感謝!

+1

爲什麼不能使用'Export-CSV'?你故意限制自己,並且無故地讓生活更加艱難 – TheIncorrigible1

+1

當你寫入文件時,無論如何,文件都被鎖定到其他進程。如果你有多個進程「隨機輪流」寫入這個文件,你仍然可以使用'Export-CSV';只要有對象,就用'-Append'開關將它導出。當對象的導出完成後,「Export-CSV」關閉並釋放文件。 –

+0

'Export-CSV'在幾秒鐘內就失敗了,這是我嘗試的第一件事。如果您可以提供更好的方法來提供建議,以便從10個以上的線程同時運行,我非常樂意聽到它。我一直堅持這一點。 – Nick

回答

2

一種方法是爲每個線程導出一個csv文件 - 使用諸如"temp_{0}.csv" -f [Guid]::NewGuid().Guid這樣的獨特文件名來防止衝突。一旦你的線程完成,這樣做:

Get-ChildItem temp_*.csv | 
    ForEach-Object { Import-Csv $_.FullName } | 
    Export-Csv BigOutputFile.csv -NoTypeInformation 

確保Get-ChildItem文件名規範不與輸出文件名規範衝突。然後刪除temp_*.csv

+0

PowerShell 5有'New-TemporaryFile'可以使用 – BenH

+0

是的,如果OP不介意寫入'$ Env:Temp'的文件。 –

+0

一如既往@Bill_Stewart,你真棒。這工作非常好,非常感謝你! – Nick

0

跳轉到我腦海的解決方案有點複雜,但會起作用。通過foreach循環運行代碼並創建一個字符串數組。在每個字符串中添加您的分隔符,因爲它會通過foreach循環,然後輸出數組。

這將讓你有分隔符而不使用export-csv