我的最终目标是获取最后一天修改文件的顶级文件夹列表(对于给定路径)。
可能有很多方法可以做到这一点。我遇到问题的地方只是获得顶级文件夹。
这是我到目前为止所做的:
Get-ChildItem -Path "c:\data\*" -recurse |
where-object {$_.lastwritetime -gt (get-date).addDays(-1)} |
where-object {-not $_.PSIsContainer} |
Foreach-Object { $_.DirectoryName} |
sort -unique
它获取了所有目录,而不仅仅是顶层。
答案 0 :(得分:2)
以下是我将如何做到这一点
$dirs = dir "sometoplevelpath" |?{ $_.PsIsContainer }
$oneDayAgo = (Get-Date).AddDays(-1)
$dirs |?{ dir $_ -Recurse |?{!$_.PsIsContainer -and $_.LastWriteTime -gt $oneDayAgo } | select -first 1 }
答案 1 :(得分:1)
您可以获取最终的文件夹列表,并比较它们的完整路径,而不是它们的名称,看它是否与包含您感兴趣的文件夹的目录相匹配:
$folders | Where-Object {$_.FullName.Replace($_.Name,"") -eq $superDirectory}
其中$ superdDirectory是包含“顶级目录”的目录的名称。在这种情况下,听起来像“C:\”。
您还可以调查PSParentPath属性。
另一种方法是首先制作潜在备份文件夹列表:
$targetFolders = Get-Item -Path "C:\data*" | Where-Object {$_.PSIsContainer}
然后浏览该列表,看看他们是否有任何需要备份的项目,如果他们这样做就会采取行动。
$targetFolders | % {
$folderItems = Get-ChildItem $_.FullName | ? {.... use your filter here}
if (($folderItems | Measure-Object).Count -gt 0){
#Backup the folder, or add $_.FullName to the list of folders that should be backed up.
}
}
答案 2 :(得分:0)
尝试删除-recurse
Get-ChildItem -Path "c:\data*" | where-object {$_.lastwritetime -gt (get-date).addDays(-1)} | where-object {-not $_.PSIsContainer} | Foreach-Object {$_.DirectoryName} | sort -unique
我还将$.
更改为$_.
。看看这是否有效。我得到它只给我顶级目录名称,但我没有任何我可以像"c\data*"