用于执行备份保留策略的脚本

时间:2019-04-25 17:24:20

标签: powershell string-comparison

我需要一个脚本,该脚本可以查看我们的备份文件夹(我们对计算机进行完整备份),并确保每台计算机存储的最新文件数量不得超过两个。我目前正在执行Powershell循环,该循环应该将每个文件名与备份文件夹中的每个其他文件进行比较。每台计算机都有多个备份文件,这些文件可以由匹配的前缀和由定界字符分隔的唯一ID号标识。

prefix =机器名称,唯一的ID表示每个备份。

我正在设置外环并碰壁。我将要检查的文件列表存储在$array中。

我有一个嵌套的for循环,我想对照数组中的每个其他文件检查每个文件。我有一个查询,应该重建数组并在每次迭代时都排除当前参考文件。

for ($i=0; $i -lt 5; $i++) { 

$ array = Get-ChildItem-路径C:\ Users \ Aaron.Trujillo \ Desktop \ test $ array = Get-ChildItem-路径C:\ Users \ Aaron.Trujillo \ Desktop \ test-排除$ array [$ i]

for ($j=0; $j -lt 5; $j++){ 
    Write-Host "i: $i  j: $j"
    Write-Host "Array i: $($array[$i].name)  Array j: $($array[$j].name)"

    if($array[$i].name -ne $array[$j].name)
    {
        Write-Host "truthval=false"
        $truthval="false"
    } 

    else
    {
        Write-Host "truthval=true"
        $truthval = "true"
    } 
}  

}

我期望这个循环将数组中的前五个文件相互比较(当前参考文件除外),并更改每个文件的变量,但是由于某种原因,参考文件并未被排除。

逻辑上一定有问题,但是我正在努力发现它。

2 个答案:

答案 0 :(得分:0)

我认为它是$array[$j.name]周围的括号,即:

if($array[$i].name -ne $array[$j].name)

编辑:

要进行故障排除,请尝试手动输出您的信息:

for ($i=0; $i -lt 5; $i++) { 

    for ($j=$i+1; $j -lt 5; $j++){ 
        Write-Host "i: $i  j: $j"
        Write-Host "Array i: $($array[$i].name)  Array j: $($array[$j].name)"

        if($array[$i].name -ne $array[$j].name)
        {
            Write-Host "truthval=false"
            $truthval="false"
        } 

        else
        {
            Write-Host "truthval=true"
            $truthval = "true"
        } 
    }  
}

答案 1 :(得分:0)

我发现您的代码存在一些缺陷。

  1. 由于$array可能是由Get-ChildItem填充的(在ntfs格式化的驱动器上,它返回 sorted 输出),根本不需要嵌套循环。
    当与一个对象进行迭代时,可以简单地与前导/从属index +/- 1进行比较。

  2. 名称根据您的描述包含一个ID,因此它们始终是不同的。因此,您必须在模糊的分隔符上拆分名称,并检查计算机名称是否相同。

  3. 您的if命令不会发出任何信息,它只会在每次迭代时覆盖相同的变量。

使用@Lee_Dailey的分组好主意,您可以即时拆分名称并检查每个组的计数,按LastWriteTime对每个组的文件进行排序,仅保留最新的2。

因此假设有文件树

> tree /F
A:.
└───Backup
        Alpha_8.bak
        Bravo_2.bak
        Bravo_5.bak
        Bravo_6.bak
        Bravo_7.bak
        Bravo_9.bak
        Charlie_1.bak
        Charlie_10.bak
        Charlie_3.bak
        Charlie_4.bak

这个小脚本:

$BackupDir = 'A:\Backup'
$Delim     = '_'

Get-ChildItem -Path $BackupDir -File | 
  Group-Object {($_.BaseName -split $Delim)[0]}

产量:

Count Name                      Group
----- ----                      -----
    1 Alpha                     {Alpha_8.bak}
    5 Bravo                     {Bravo_2.bak, Bravo_5.bak, Bravo_6.bak, Bravo_7.bak...}
    4 Charlie                   {Charlie_1.bak, Charlie_10.bak, Charlie_3.bak, Charlie_4.bak}

然后,您可以通过任何方式迭代组并删除每个组中的文件,
例如,删除每台计算机上除2个最新文件(每个LastWriteTime定义)以外的所有文件:

Get-ChildItem -Path $BackupDir -File | 
  Group-Object {($_.BaseName -split $Delim)[0]} | ForEach-Object {
    $_.Group | Sort LastWriteTime -Desc | Select -skip 2 | Remove-Item -WhatIf
  }

如果输出看起来正常,请删除结尾的-WhatIf