【问题标题】:Powershell Get-ChildItem, filtered on date with Owner and export to txt or csvPowershell Get-ChildItem,使用所有者过滤日期并导出到 txt 或 csv
【发布时间】:2017-06-02 04:09:49
【问题描述】:

我正在尝试在设定的日期之后导出文档修改文件的列表,包括使用 Get-ChildItem 递归扫描的所有者。

由于某种原因,我无法将其移植到文件/csv:

$Location2 = "\\fs01\DATAIT"
$loc2 ="melb"

cd $Location2

Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | foreach { Write-Host $_.Name "," $_.lastwritetime "," ((get-ACL).owner) } > c:\output\filelisting-$loc2.txt

请这里的任何 PowerShell 专家提供一些启示吗?

【问题讨论】:

    标签: powershell csv get-childitem


    【解决方案1】:

    您的代码的问题是您使用的是Write-Host,它显式地将输出发送到控制台(然后您无法将其重定向到其他地方)。快速修复如下:

     Get-ChildItem -Recurse | Where-Object {  $_.lastwritetime -gt [datetime]"2017/05/01" } | foreach { "$($_.Name),$($_.lastwritetime),$((get-ACL).owner)" } > filelisting-$loc2.txt
    

    这会将字符串输出到标准输出(相当于使用Write-Output)。我已将其设为单个字符串,其中包含您想要通过在双引号字符串中使用子表达式运算符 $() 访问的变量。该操作符对于访问对象的属性或在此类字符串中执行其他 cmdlet/复杂代码(基本上除了简单的 $variable 之外的任何代码)是必需的。

    您可以通过创建对象结果来进一步改进代码,然后您可以利用管道中的其他 cmdlet,例如 Export-CSV。我建议这样做:

    Get-ChildItem -Recurse | Where-Object {  $_.lastwritetime -gt [datetime]"2017/05/01" } | ForEach-Object { 
        $Properties = [Ordered]@{
            Name  = $_.Name
            LastWriteTime = $_.LastWriteTime
            Owner = (Get-ACL).Owner
        }
    
        New-Object -TypeName PSObject -Property $Properties
    } | Export-CSV $Loc2.csv
    

    这会创建一个包含所需属性的哈希表 @{},然后使用该哈希表创建一个带有 New-Object 的 PowerShell 对象。然后此对象返回到标准输出,该输出进入管道,因此当 ForEach-Object 循环得出结论时,所有对象都发送到Export-CSV,然后将它们正确输出为 CSV(因为它需要对象输入)。


    • 顺便说一句,这里有一篇来自 PowerShell 的创建者的有趣读物,内容是为什么 Write-Host is considered harmful。

    • [Ordered] 需要 PowerShell 3 或更高版本。如果您使用的是 PowerShell 2,请将其删除。它只是按照定义的顺序保持对象内属性的顺序。

    【讨论】:

    • 完美!非常感谢您的回答,辛苦了!我已经开始将 export-CSV 用于其他脚本,它很棒,我不知道它存在哈哈。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多