我需要一个脚本,该脚本可以查看我们的备份文件夹(我们对计算机进行完整备份),并确保每台计算机存储的最新文件数量不得超过两个。我目前正在执行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"
}
}
}
我期望这个循环将数组中的前五个文件相互比较(当前参考文件除外),并更改每个文件的变量,但是由于某种原因,参考文件并未被排除。
逻辑上一定有问题,但是我正在努力发现它。
答案 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)
我发现您的代码存在一些缺陷。
由于$array
可能是由Get-ChildItem
填充的(在ntfs格式化的驱动器上,它返回 sorted 输出),根本不需要嵌套循环。
当与一个对象进行迭代时,可以简单地与前导/从属index +/- 1
进行比较。
名称根据您的描述包含一个ID,因此它们始终是不同的。因此,您必须在模糊的分隔符上拆分名称,并检查计算机名称是否相同。
您的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