【问题标题】:Powershell out-file csv delimitingPowershell 输出文件 csv 定界
【发布时间】:2015-06-09 19:48:18
【问题描述】:

我有一个使用 robocopy 列出文件的 powershell 命令。我正在尝试输出到 csv,但它没有根据需要分隔列。我得到两列应该是 5。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,它只带回了路径的字符串长度。

有什么建议吗?

【问题讨论】:

  • Out-File 在您的情况下只是将robocopy 的输出写入文件,因此除非robocopy 正确格式化它,否则您将无法获得正确的CSV 作为输出。 Export-Csv 需要对象列表作为输入,而 robocopy 的输出是字符串列表。我建议您先详细描述您尝试实现的目标。

标签: powershell csv delimiter robocopy


【解决方案1】:

我假设您需要列出某个文件夹下的所有文件。您可以使用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 使用$Matches 创建具有命名属性的对象由-match 运算符在Where-Object 中使用。

【讨论】:

  • 你是对的我正在尝试获取目录中所有子文件夹和对象的列表。 Get-ChildItem 是否支持超过 260 个字符的路径名?我认为只有 robocopy 能够支持多达 36,000 个路径和文件名。
  • 你说得对,Get-ChildItem 无法处理长路径名。
  • 我很欣赏代码的 sn-p。我也许可以将它用于其他任务。
  • 更新为正确处理路径中的空格
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
相关资源
最近更新 更多