【问题标题】:Powershell: Export-CSV and OutFile not doing what I expectPowershell:Export-CSV 和 OutFile 没有达到我的预期
【发布时间】:2018-04-02 16:28:29
【问题描述】:

为什么我在这里得到一个空白文件?当我在 export-csv 之前运行它时,我会在控制台中显示大量记录。

这是我正在使用的代码

$path = "C:\test"

Get-ChildItem -Path $path -Include *.edi, *.x12, *.filename, *.dat, *.log, *.mdn, *.req -Recurse -Force |
Where-Object {!$_.PSIsContainer -and ((get-date)-$_.LastWriteTime).days -gt 30 } |
Remove-Item -force -whatif | export-csv D:\output.csv #also I try out-file D:\output.txt 

【问题讨论】:

  • 相当肯定 -Whatif 生成详细输出,因此管道中不会有任何对象传递给 Export-csv。
  • @EBGreen:关于-WhatIf 的总体观点很好,但看起来信息直接打印到控制台,而不是详细的输出流(编号4)。
  • @mklement0 你的假设是正确的(它是[string] 对象输出到1 流)
  • @TheIncorrigible1:在 PowerShell 的上下文中,1 是成功(数据)输出流,但这不是 -WhatIf 输出的位置 - 据我所知,您无法捕获/ 从 within PowerShell 将其全部重定向。 (您可以从外部,例如从cmd.exe 呼叫时)。
  • @mklement0 嗯,我很快就在这里开枪了。将命令包装在括号中并访问其类型报告的字符串,但现在尝试使用重定向或其他 cmdlet 不会捕获该输出。它甚至不像 PSv5 中的 Write-Host 那样使用 5(信息)

标签: powershell output export-csv


【解决方案1】:

通用参数-WhatIf - 用于预览命令的动作 - 从不输出数据;相反,预览信息直接打印到控制台,这意味着它既不能通过管道发送,也不能重定向到文件,也不能捕获

顺便说一句:Remove-Item without -WhatIf 也从不产生数据输出,因此尝试在后续管道段中处理其输出通常没有意义。支持>

您最好的选择是在您的Where-Object 调用中添加一个-OutVariable (-ov) 通用参数,这样您就可以通过Export-Csv 导出收集的文件信息对象单独的命令:

Get-ChildItem ... | Where-Object -OutVariable filesToRemove { ... } | 
  Remove-Item -WhatIf ...
$filesToRemove | Export-Csv D:\output.csv

上面还是将预览信息打印到控制台,但也将Where-Object选中的[System.IO.FileInfo]对象收集到变量$filesToRemove中,然后可以导出为CSV格式。

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多