2015-06-09 108 views
0

我有一個使用robocopy列出文件的powershell命令。我試圖輸出到CSV,但它不會根據需要分隔列。我得到兩列,應該是5.是否有一個out-file csv的分隔符參數?Powershell out-file csv分隔

下面是當前的代碼:

robocopy .\Documents\ NULL /L /S /V /E /BYTES /FP /NC /NDL /XJ /TS /R:1 /W:2 | Out-File -Append -FilePath "c:\beehive_20150608.csv" -Encoding ASCII 

我試圖export-csv並且只帶迴路徑的字符串長度。

有什麼建議嗎?

+4

在您的案例中,'Out-File'只是將'robocopy'的輸出寫入文件,所以除非'robocopy'格式正確,否則您將無法獲得正確的CSV輸出。 'Export-Csv'需要對象列表作爲輸入,而robocopy的輸出是字符串列表。我建議你先詳細描述一下你想要達到的細節。 – n0rd

回答

2

我假設你需要列出某個文件夾下的所有文件。您可以使用Get-ChildItem -Recurse爲代替robocopy,用Where-Object只過濾文件然後選擇屬性只有你想Select-Object

Get-ChildItem .\Documents -Recurse | Where-Object {!$_.PsIsContainer}| Select-Object -property LastWriteTime,Length,FullName | Export-Csv aaa.csv 

如果你需要使用robocopy您可以嘗試解析它的輸出:

robocopy .\Documents\ NULL /L /S /V /E /BYTES /FP /NC /NDL /XJ /TS /R:1 /W:2 /njh /njs | Where-Object {$_ -match '^\s*([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+(.*?)\s*$'} | ForEach-Object { new-object PSObject -property @{Length=$matches[1];Date=$matches[2];Time=$matches[3];Name=$matches[4]}} | Export-Csv aaa.csv 

這是醜陋的,但應該做你需要的。我加入/njh/njs參數到命令行抑制robocopy的頁眉和頁腳,Where-Object除去非匹配(空)線和ForEach-Object創建具有使用由Where-Object使用-match操作者創建$Matches命名屬性的對象。

+0

你是正確的我想要獲取目錄中所有子文件夾和對象的列表。 Get-ChildItem支持的路徑名長於260個字符?我認爲只有robocopy能夠支持高達36,000的路徑和文件名。 – maxim

+0

你說得對,'Get-ChildItem'不能處理長路徑名。 – n0rd

+0

@maxim,看我的更新。 – n0rd