我正在编写一个删除旧sql备份的脚本,但只有在有新版本的情况下才会删除。我写了下面的脚本,但不确定我是否应该以这种方式处理$d[0] -eq $null
部分。我尝试进行计数,但逻辑仍然失败,因为如果$dir | Get-ChildItem | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays($days) -and $_.extension.ToString() -eq ".bak"}
没有返回$d
仍然没有计数1.那么,还有另一种方式或写这个吗?
Set-Location \\Server\Backups
$days = -2
$list = @()
$DBFolders = Get-ChildItem | Where-Object {$_.PSIsContainer -eq $true }
Foreach ($dir in $DBFolders)
{
$d = @()
$d += $dir | Get-ChildItem | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays($days) -and $_.extension.ToString() -eq ".bak"}
if ($d[0] -ne $null)
{
$list += $dir | Get-ChildItem | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays($days) -and $_.extension.ToString() -eq ".bak" -or $_.extension.tostring() -eq ".trn"}
}
}
$list | remote-item
答案 0 :(得分:1)
只需测试$d
是否评估为$true
或$false
- 空集合始终评估为$false
:
$d = @()
$d += $dir | Get-ChildItem | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays($days) -and $_.extension.ToString() -eq ".bak"}
if($d){
# $d is not empty
}
答案 1 :(得分:0)
您可以尝试以下操作:
$ts = (Get-Date).AddDays(-2); # so we don't call it dozens of times
$dirsToClean = Get-ChildItem -Directory | Where-Object { Get-ChildItem $_\*.bak | Where-Object {$_.LastWriteTime -gt $ts} };
$filesToDelete = $dirsToClean | ForEach-Object {Get-ChildItem (Join-Path $_ *) -Include *.bak,*.trn | Where-Object {$_.LastWriteTime -lt $ts}};
变量名应该是不言自明的。