【问题标题】:Powershell -- Get-ChildItem Directory full path and lastaccesstimePowershell -- Get-ChildItem Directory 完整路径和 lastaccesstime
【发布时间】:2017-10-24 16:13:15
【问题描述】:

我试图在一行中输出完整的目录路径和 lastaccesstime。

需要 -- R:\Directory1\Directory2\Directory3,1015 年 3 月 10 日

我得到了什么—— R:\Directory1\Directory2\Directory3

1015 年 3 月 10 日

这是我的代码,它并不复杂,但它超出了我的范围。

Get-ChildItem -Path "R:\" -Directory | foreach-object -process{$_.FullName, $_.LastAccessTime} | Where{ $_.LastAccessTime -lt [datetime]::Today.AddYears(-2) } | Out-File c:\temp\test.csv

我过去使用过 foreach-object 以确保不会截断过长的目录名称和路径,但在拉取两个属性时从未使用过它。我希望所有信息都在一条线上,但没有成功。提前感谢您的帮助。

【问题讨论】:

  • 当我理解你的正确时,你唯一缺少的是两个属性之间的逗号?

标签: powershell get-childitem


【解决方案1】:

我建议在选择所需属性之前过滤 (Where-Object)。另外我认为您想用Select-Object 替换ForEach-Object,最后我认为您需要Export-Csv 而不是Out-File。示例:

Get-ChildItem -Path "R:\" -Directory |
  Where-Object { $_.LastAccessTime -lt [DateTime]::Today.AddYears(-2) } |
  Select-Object FullName,LastAccessTime |
  Export-Csv C:\temp\test.csv -NoTypeInformation

【讨论】:

  • 绝对! PowerShell 中的一个主要概念是“向左过滤,向右格式化”——换句话说,尽可能早地进行过滤,并在可能的最后一分钟进行数据结构化和输出。这最大限度地减少了您所做的整体处理,因为您没有处理最终会因为不符合您的标准而丢弃的实体。 Bryce 获得了赞成票,因为他对他的过程进行了清晰而详细的解释;你得到了赞成,因为你的最终代码是更好的解决方案——你的答案应该是最终被接受的。
  • 谢谢比尔。太棒了。还要感谢 Jeff 的解释。非常感谢这里的每一个人。
【解决方案2】:

我们可以很容易地将您的输出放在一行中,但为了便于阅读,我们可能必须将您的脚本拆分为多行。我建议将下面的脚本保存为“.ps1”,这样您就可以右键单击并选择“使用 powershell 运行”,以便将来更轻松。可以修改此脚本以使用更多输入和变量,以使其更加模块化并在更多情况下工作,但现在我们将使用您提供的常量。

$dirs = Get-ChildItem -Path "R:\" -Directory

我们会保留您创建的第一行,因为它是可靠的,没有什么可以改变的。

$arr = $dirs | Select-Object {$_.FullName, $_.LastAccessTime} |  Where-Object{ $_.LastAccessTime -lt [datetime]::Today.AddYears(-2) }

对于第二行,我们将使用“Select-Object”。在我看来,以这种方式创建数组要容易得多。我们希望将答案作为一个数组来处理,因为以这种方式将键值对彼此相邻发布是最容易的。我已将您的“Where”扩展为“Where-Object”,因为最好使用完整的 cmdlet 名称而不是别名。

最后,在放入临时输出文件之前,我们需要将“$arr”对象转换为 csv。

ConvertTo-CSV $arr | Out-File "C:\Temp\test.csv"

将它们放在一起,您的最终脚本将如下所示:

$dirs = Get-ChildItem -Path "C:\git" -Directory
$arr = $dirs | Select-Object {$_.FullName, $_.LastAccessTime} | Where{ $_.LastAccessTime -lt [datetime]::Today.AddYears(-2) }
ConvertTo-CSV $arr | Out-File "C:\Temp\test.csv"

同样,您可以通过创建一个函数、将其绑定到一个 cmdlet 并为您的路径、输出文件和所有有趣的东西创建参数来更进一步。

如果这有帮助,请告诉我!

【讨论】:

  • 这是对您对询问者代码的修改的一个很好的解释,但请参阅比尔的回答和我的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多