首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Powershell在每个子目录中查找最古老的文件

使用Powershell在每个子目录中查找最古老的文件
EN

Stack Overflow用户
提问于 2019-05-07 17:52:56
回答 2查看 1.2K关注 0票数 0

我的公司最近搬到了outlook365。我们完全基于VDI,因此我们的用户配置文件存储在一个服务器上。因此,我们的用户现在都有2+ .ost文件占用服务器上的存储空间。我想编写一个脚本来查找和删除无关的.ost文件。此外,我想安排脚本每月运行,以清理任何孤儿. .ost's发生的任何其他原因。

我尝试了几种不同的解决方案,但似乎找不到正确的语法来识别每个子目录中最古老的/原始的,所有的尝试都从整个目录或目录中的所有.ost文件中识别出最老的文件。

代码语言:javascript
复制
$Path = "<path>" 

$SubFolders = dir $Path -Recurse | Where-Object {$_.PSIsContainer} | ForEach-Object -Process {$_.FullName}

ForEach ($Folder in $SubFolders)
    {
    $FullFileName = dir $Folder | Where-Object {!$_.PSIsContainer} | Sort-Object {$_.LastWriteTime} -Descending | Select-Object -First 1     
    }
EN

回答 2

Stack Overflow用户

发布于 2019-05-07 18:04:07

在循环中,您可以使用以下方法列出具有最古老的.ost值的LastWriteTime文件。只需将-Descending标志添加到Sort-Object以列出最新文件即可。

代码语言:javascript
复制
$FullFileName = foreach ($folder in $Subfolders) {
    $Get-ChildItem -Path $folder -Recurse -File -Filter "*.ost" |
      Sort-Object -Property LastWriteTime |
        Select-Object -Property FullName -First 1
}
$FullFileName

如果在.ost路径中只找到一个$folder文件,它仍然会找到该文件。因此,当只有一个文件时,您将需要逻辑来不删除。这并不能保证它是最古老的文件。您可能希望将最古老的CreationTime和最新的LastWriteTime结合起来。下面将列出基于.ost的最古老的CreationTime文件。

代码语言:javascript
复制
$FullFileName = foreach ($folder in $Subfolders) {
    Get-ChildItem -Path $folder -Recurse -File -Filter "*.ost" |
          Sort-Object -Property CreationTime |
            Select-Object -Property FullName -First 1
}
$FullFileName

另一个问题是在foreach循环中设置$FullFileName变量。这意味着它将通过每个循环迭代被覆盖。因此,如果在循环完成后检索该值,则只会找到最后一个值。将变量设置为foreach循环输出的结果将创建一个具有多个值的数组。

若要仅在有多个OST文件时输出OST文件路径,可以执行以下操作:

代码语言:javascript
复制
$FullFileName = foreach ($folder in $Subfolders) {
    $files = Get-ChildItem -Path $folder -Recurse -File -Filter "*.ost" |
          Sort-Object -Property LastWriteTime -Descending
    if ($files.count -ge 2) {
           $files | Select-Object -Property FullName -First 1
    }
$FullFileName
票数 1
EN

Stack Overflow用户

发布于 2019-05-07 18:09:49

这个班轮应该完成这个工作,用最新的LastWriteTime保存ost文件。

代码语言:javascript
复制
gci -Path $Path -directory | where {(gci -Path $_\*.ost).count -gt 1}|%{gci -Path $_\*.cmd|Sort-Object LastWriteTime -Descending|Select-Object -Skip 1|Remove-Item -WhatIf}

后面是较长的变体。

代码语言:javascript
复制
$Path = '<path>'
$Ext  = '*.ost'
Get-ChildItem -Path $Path -directory -Recurse | 
  Where-Object {(Get-ChildItem -Path "$_\$Ext" -File -EA 0).Count -gt 1} | 
    ForEach-Object {
      Get-ChildItem -Path "$_\$Ext" -File -EA 0| Sort-Object LastWriteTime -Descending | 
        Select-Object -Skip 1 | Remove-Item -WhatIf
    }

前两行使用多个.ost文件计算文件夹,下一行迭代这些文件夹并按LastWriteTime排序,跳过第一行(最新的),然后使用-WhatIf参数对另一行进行管道删除,只显示测试时要删除的内容。

当然,您也可以将它们移动到备份位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56028072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档