PowerShell:脚本不会计算上次修改日期之前30岁以上的文件

时间:2017-04-18 05:07:46

标签: windows powershell

所有

我被困住了。我有一个PowerShell脚本,它查找特定文件夹中的文件,这些文件超过了上次修改日期的30天(另外,如果它不存在,它将创建该文件夹)。它创建了文件夹,它为我提供了总文件,它将列出测试查询中的所有文件,但它实际上不会计算30天以上文件的数量。我已经尝试了几种方法来计算这些(有些方法来自其他解决方案来删除此站点中的旧文件),但PowerShell只是不想这样做。

到目前为止,这是我的代码......

$HomePath = $env:USERPROFILE
$CompanyFolder = "\Company"
$TimeSensativeFolder = "\TimeSensative"
$TimeSensativePath = $HomePath+$CompanyFolder+$TimeSensativeFolder
$OldFilesAmount = 0
$TotalFilesAmount = 0
$TimeLimit = (Get-Date).AddDays(-30)
$StatusOK = "No old files were found in the time sensative folder."
$StatusCreated = "The time sensative folder was created."
$StatusError1 = "There were old files found in the time sensative folder!"
$StatusError2 = "Unable to create the time sensative folder!"

function MakeTimeSensativeFolder ($TimeSensativePath) {
    try {
        md $TimeSensativePath -Force -ErrorAction Stop
        Write-Host $StatusCreated
    }
    catch {
        Write-Host $StatusError2
    }
}

function CountOldFiles () {
    $OldFilesAmount = $OldFilesAmount + 1
}

if(!(Test-Path $TimeSensativePath -PathType Container)) {
    MakePHIFolder $TimeSensativePath
}
else {

}

try {
    $TotalFilesAmount = (Get-ChildItem $PHIPath -Recurse -File | Measure-Object).Count

    # I've tried this...
    Get-Item $PHIPath | Foreach {$_.LastWriteTime} -ErrorAction Stop
        if (Get-Content $_.LastWriteTime | Where-Object {$_ -gt $TimeLimit}) {
              CountOldFiles
        }

    # And I've tried this...
    Get-ChildItem -Path $PHIPath -Recurse -File | Foreach-Object {
        if (Get-Content $_.LastWriteTime | Where-Object {$_ -gt $TimeLimit}) {
           CountOldFiles
       }
    }

    # I've even tried this...
    Get-ChildItem $PHIPath -Recurse -File | ? {
       -not $_.PSIsContainer -and $_.LastWriteTime -lt $TimeLimit
    } | CountOldFiles

    # And this, as well...
    Get-ChildItem -Path $PHIPath -Recurse -File | Where-Object {$_.LastWriteTime -gt $TimeLimit} | CountOldFiles

}
catch {
    MakeTimeSensativeFolder $TimeSensativePath
}

# Used for testing.
<#
Get-ChildItem $TimeSensativePath -Recurse -File
Write-Host "TimeSensative folder exists:" $TimeSensativePathExists
Write-Host "Home TimeSensative path:" $TimeSensativePath
Write-Host "Old files found:" $OldFilesAmount
Write-Host "Total files found:" $TotalFilesAmount
Exit
#>

# Determining proper grammar for status message based on old file count.
if ($OldFilesAmount -eq 1) {
    $StatusError1 = "There was "+$OldFilesAmount+" old file of "+$TotalFilesAmount+" total found in the PHI folder!"
}
if ($OldFilesAmount -gt 1) {
    $StatusError1 = "There were "+$OldFilesAmount+" old files of "+$TotalFilesAmount+" total found in the PHI folder!"
}

# Give statuses.
if ($OldFilesAmount -gt 0) {
    Write-Host $StatusError1
}
else {
    Write-Host $StatusOK
}

根据我的尝试,我不会得到任何结果,或者我会得到这样的结果:

Get-Content : Cannot find drive. A drive with the name '12/22/2016 17' does not exist.
At C:\Users\nobody\Scripts\PS1\ts_file_age.ps1:54 char:14
+          if (Get-Content $_.LastWriteTime | Where-Object {$_ -gt $Tim ...
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (12/22/2016 17:String) [Get-Content], DriveNotFoundException
        + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetContentCommand

在任何情况下,我都在努力要求,没有旧文件数。

这有点令人头疼。有什么建议吗?

提前非常感谢!

2 个答案:

答案 0 :(得分:1)

使用上次写入时间过滤文件非常简单。像这样,

$allFiles = gci 
$d = (Get-Date).adddays(-30)
$newFiles = @()
$oldFiles = @()
$allFiles | % { if ($_.lastwritetime -ge $d) { $newFiles +=$_ } else { $oldFiles += $_ } }

这里做的是首先在集合中设置所有文件。这不是强制性的,但可以浏览集合以检查它是否已正确填充。这在具有复杂路径或排除过滤器的情况下非常有用。

第二步是获得稍后用于将文件分成新旧文件的DateTime。就像样本一样,这里没有什么有趣的。实际上,有一件小事。日期为-30天,但小时,分钟和秒基于当前时间。因此,如果有非常严格的限制,请考虑使用午夜时间([datetime]::Today).AddDays(-30)

第三步是为新旧文件声明两个空集合。

最后一步是遍历$allFiles并检查上次写入时间。如果它大于或等于分界点,请将其添加到$newFiles,其他人$OldFiles

在最后一步之后,进一步处理应该足够简单。

答案 1 :(得分:-1)

这就是我要做的事情(在这种情况下删除)早于X天的文件:

$Days = 5
$limit = (Get-Date).AddDays(-$Days)
$CurrentDate = Get-Date

#This will delete all files older than 5 days

Get-ChildItem -Path $Workdir -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $limit } | Remove-Item -Force