如何删除不同位置中X天前的多个文件?

3
#----- define parameters -----#
#----- get current date ----#
$Now = Get-Date

#----- define amount of days ----#
$Days = "3"
#----- define folder where files are located ----#
$TargetFolder = "C:\test2"
#----- define extension ----#
$Extension = "*.*"
#----- define LastWriteTime parameter based on $Days ---#
$LastWrite = $Now.AddDays(-$Days)

#----- get files based on lastwrite filter and specified folder ---#
$Files = Get-ChildItem $TargetFolder -Include $Extension -Recurse |
         Where  {$_.LastWriteTime -le "$LastWrite"} 

foreach ($File in $Files) {
    if ($File -ne $NULL) {
        Write-Host "Deleting File $File" -ForegroundColor "Red"
        Remove-Item $File.FullName | Out-Null
    } else {
        Write-Host "No more files to delete!" -foregroundcolor "Green"
    }
}

这是一份不错的PowerShell脚本,用于删除X天前创建的文件。但我们希望能够同时删除保存在不同路径下、不同保存天数的多个文件。
例如,如果我们需要删除3天前的文件,则可以按照以下示例添加另一个路径:
$TargetFolder = "C:\test","C:\test2" 

它可以处理这两个文件夹,但我们想知道是否有一种方法可以为不同的文件夹设置不同的天数。

ksh中,我们在配置文件中使用以下方式:

Location 1;//Server1/c$/processed;14
Location 2;//Server2/backup/;3
4个回答

3

使用参数 "age" 和 "location" 调用脚本

Param
(
    [int]$days,
    [string]$Targetfolder
)
#----- define parameters -----#
#----- get current date ----#
$Now = Get-Date

#----- define amount of days ----#
#$Days = '3'
#----- define folder where files are located ----#
#$TargetFolder = 'C:\test2'
#----- define extension ----#
$Extension = '*.*'
#----- define LastWriteTime parameter based on $Days ---#
$LastWrite = $Now.AddDays(-$Days)

#----- get files based on lastwrite filter and specified folder ---#
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where-Object  {$_.LastWriteTime -le "$LastWrite"} 

foreach ($File in $Files) 
{
    if ($File -ne $NULL)
    {
        write-host "Deleting File $File" -ForegroundColor 'Red'
        Remove-Item $File.FullName | out-null
    }
    else
    {
        Write-Host 'No more files to delete!' -foregroundcolor 'Green'
    }
}

将其保存为 .ps1 文件,然后像这样调用 MyScript.ps1 -Targetfolder C:\Blah -Days 4。它与目标文件夹和指定天数一起使用。

1
移除$lastwrite周围的引号。 - Frode F.
非常感谢@restless1987!它像魔法一样奏效了!还要感谢大家提供的宝贵意见-谢谢/ Adnan - Altimo

1
这是我的解决方案。您可以将其复制/粘贴到脚本中使用。然后,像这样调用它:
PS> $Folders = 'C:\Folder1','C:\Folder2'
PS> .\Remove-OldFiles.ps1 -FolderPath $Folders -DaysOld 30 -WhatIf

接下来,如果一切看起来都很好,就删除-WhatIf。这应该比你之前的脚本快得多,因为它使用了PSv4中更新的.where()和.foreach()方法。

#Requires -Version 4

[CmdletBinding(SupportsShouldProcess,ConfirmImpact = 'High')]
param (
    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [string[]]$FolderPath,

    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [int]$DaysOld,

    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [ValidateLength(1, 3)]
    [string]$FileExtension
)

$Now = Get-Date

$gciParams = @{
    'Recurse' = $true
    'File' = $true
}

if ($PSBoundParameters.ContainsKey('FileExtension')) {
    $gciParams.Filter = "Extension -eq $FileExtension"
}

$LastWrite = $Now.AddDays(-$DaysOld)

foreach ($path in $FolderPath)
{
    $gciParams.Path = $path
    ((Get-ChildItem @gciParams).Where{ $_.LastWriteTime -le $LastWrite }).foreach{
        if ($PSCmdlet.ShouldProcess($_.FullName, 'Remove'))
        {
            Remove-Item -Path $_.FullName -Force
        }
    }
}

1

我建议参数化脚本,就像@restless1987建议的那样。但是,如果你想从文件中读取信息,你可以在第二个PowerShell脚本中创建一个哈希表:

# config.ps1

$locations = @{
  'C:\processed' = 14
  'D:\backup'    = 3
}

并且在你的脚本中dot-source该文件:

. 'C:\path\to\config.ps1'

所以你可以像这样使用哈希表:
foreach ($TargetFolder in $locations.Keys) {
    $LastWrite = $Now.AddDays(-$locations[$TargetFolder])
    $Files = Get-ChildItem $TargetFolder -Include $Extension -Recurse |
             Where-Object  {$_.LastWriteTime -le $LastWrite} 

    foreach ($File in $Files) {
        ...
    }
}

0
创建一个函数来处理你的工作,并将路径保存在哈希表中。
$targetFolder = @()

$targetFolder += @{'Folder'='c:\test1'; 'Extension'='*.*'; 'Days'=3}
$targetFolder += @{'Folder'='c:\test2'; 'Extension'='*.*'; 'Days'=5}
$targetFolder += @{'Folder'=@('c:\test3', 'c:\test4'); 'Extension'='*.*'; 'Days'=7}

function DeleteOldFiles($TargetFolder, $Extension, $Days)
{
    $lastWrite = (Get-Date).AddDays(-$Days)

    # do your Get-ChildItem logic here
    $files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where  {$_.LastWriteTime -le "$lastWrite"} 

    foreach ($file in $files) 
    {
        if ($file -ne $null)
        {
            Write-host "Deleting File $file" -ForegroundColor "Red"
            Remove-Item $file.FullName | out-null
        }
        else
        {
            Write-Host "No more files to delete!" -foregroundcolor "Green"
        }
    }
}

$targetFolder | DeleteOldFiles $_.Folder $_.Extension $_.Days

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接