Powershell--获取子项目录完整路径和lastaccesstime

Powershell--获取子项目录完整路径和lastaccesstime,powershell,get-childitem,Powershell,Get Childitem,我试图在一行中输出完整目录路径和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

我试图在一行中输出完整目录路径和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对象是为了确保不会截断过长的目录名和路径,但在提取两个属性时从未使用过它。我希望所有的信息都在一条线上,但没有成功。提前感谢您的帮助。

我建议您在选择所需属性之前先过滤Where对象。另外,我认为您希望用Select对象替换ForEach对象,最后我认为您希望导出Csv而不是Out文件。例如:

Get-ChildItem -Path "R:\" -Directory |
  Where-Object { $_.LastAccessTime -lt [DateTime]::Today.AddYears(-2) } |
  Select-Object FullName,LastAccessTime |
  Export-Csv C:\temp\test.csv -NoTypeInformation
我建议在选择所需的属性之前过滤对象所在的位置。另外,我认为您希望用Select对象替换ForEach对象,最后我认为您希望导出Csv而不是Out文件。例如:

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

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

$dirs = Get-ChildItem -Path "R:\" -Directory
我们将保留你的第一行,因为这是可靠的,没有什么可以改变的

$arr = $dirs | Select-Object {$_.FullName, $_.LastAccessTime} |  Where-Object{ $_.LastAccessTime -lt [datetime]::Today.AddYears(-2) }
对于第二行,我们将使用Select Object。在我看来,以这种方式创建数组要容易得多。我们希望将答案作为一个数组来处理,因为通过这种方式将键、值对彼此相邻放置是最容易的。我已经扩展了Where-to-Where对象,因为最好使用完整的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,并为路径、输出文件和所有有趣的东西创建参数来进一步实现这一点


让我知道这是否有帮助

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

$dirs = Get-ChildItem -Path "R:\" -Directory
我们将保留你的第一行,因为这是可靠的,没有什么可以改变的

$arr = $dirs | Select-Object {$_.FullName, $_.LastAccessTime} |  Where-Object{ $_.LastAccessTime -lt [datetime]::Today.AddYears(-2) }
对于第二行,我们将使用Select Object。在我看来,以这种方式创建数组要容易得多。我们希望将答案作为一个数组来处理,因为通过这种方式将键、值对彼此相邻放置是最容易的。我已经扩展了Where-to-Where对象,因为最好使用完整的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,并为路径、输出文件和所有有趣的东西创建参数来进一步实现这一点


让我知道这是否有帮助

当我正确理解你时,你唯一缺少的是两个属性之间的逗号?当我正确理解你时,你唯一缺少的是两个属性之间的逗号?绝对!PowerShell中的一个主要概念是“左过滤,右格式化”——换句话说,尽可能早地进行过滤,并在最后一分钟进行数据结构化和输出。这将最小化您所做的总体处理,因为您不会处理最终将放弃的实体,因为这些实体不符合您的标准。布莱斯获得了一张选票,因为他清楚详细地解释了他的过程;你获得了投票权,因为你的最终代码是更好的解决方案——你的答案应该是最终被接受的答案。谢谢比尔。这太完美了。还要感谢杰夫的解释。非常感谢这里的每一个人,绝对感谢!PowerShell中的一个主要概念是“左过滤,右格式化”——换句话说,尽可能早地进行过滤,并在最后一分钟进行数据结构化和输出。这将最小化您所做的总体处理,因为您不会处理最终将放弃的实体,因为这些实体不符合您的标准。布莱斯因为清楚而详细的解释而获得了一张赞成票
对其过程的分析;你获得了投票权,因为你的最终代码是更好的解决方案——你的答案应该是最终被接受的答案。谢谢比尔。这太完美了。还要感谢杰夫的解释。非常感谢在座的每一位。这是对您修改querent代码的一个很好的解释,但请参见Bill的回答和我的评论。这是对您修改querent代码的一个很好的解释,但请参见Bill的回答和我的评论。