Powershell 避免此$null测试的方法

Powershell 避免此$null测试的方法,powershell,Powershell,我正在编写一个脚本,该脚本将删除旧的sql备份,但只有在有新的备份时才会删除。我已经编写了下面的脚本,但不确定是否应该这样处理$d[0]-eq$null部分。我尝试进行计数,但逻辑一直失败,因为如果$dir | Get ChildItem | Where对象{$$\u.LastWriteTime-gt(Get Date).AddDays($days)-和$\u.extension.ToString()-eq.bak”}未返回任何内容$d的计数仍然为1。那么,有没有其他方法来写这个 Set-Loc

我正在编写一个脚本,该脚本将删除旧的sql备份,但只有在有新的备份时才会删除。我已经编写了下面的脚本,但不确定是否应该这样处理
$d[0]-eq$null
部分。我尝试进行计数,但逻辑一直失败,因为如果
$dir | Get ChildItem | Where对象{$$\u.LastWriteTime-gt(Get Date).AddDays($days)-和$\u.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

只需测试
$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
}

您可以尝试以下操作:

$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}};
变量名应该是自解释的