Цикл PowerSach foreach завершается неудачно, так как он увеличивает счетчик при первом тестировании

1

Меня попросили контролировать c: \ temp на серверах Windows. Мне нужно знать, сколько там папок, и если их там больше, чем 1, 2 и 3 минуты. Эта отчетность работает в базовой форме, но не полностью правильно. Как только есть 1 папка, я все еще получаю отчет об этом, будучи там больше 3 минут, который является ложным. Что не так с моим для цикла? Что я хочу с помощью цикла for, так это подсчитать количество папок, которые существуют и имеют определенный возраст. Но цикл for повторяется один раз, и я получаю счетчик = 1, хотя это неправильно. то есть, это секунды, но я получаю отчет, что это там 3 минуты. Любой вклад будет оценен. Спасибо

Вот мой очень плохой код ...

    $Now = Get-Date
    $OneMinute = 1
    $TwoMinutes = 2
    $ThreeMinutes = 3
    $TargetFolder = "C:\Temp"
    $LastWrite1Min = $Now.AddMinutes(-$OneMinute)
    $LastWrite2Min = $Now.AddMinutes(-$TwoMinutes)
    $LastWrite3Min = $Now.AddMinutes(-$ThreeMinutes)
    $i=0
    $j=0
    $k=0
    $g=0
    $StringThere = "There are "
    $StringOne = "Folder(s) older than 1 Minute"
    $StringTwo = "Folder(s) Older than 2 Minute"
    $StringThree = "Folder(s) Older than 3 Minute"

    $directoryInfo = Get-ChildItem C:\Temp | Measure-Object
    #$directoryInfo.count #Returns the the number folders within the directory
    If ($directoryInfo.count -eq 0){
    write-host "Folder is empty - Good!"
    }

    ##################################################
    If ($directoryInfo.count -ne 0){
    write-host "Temp has at least one folder present - ... "

    $Folders = get-childitem -path $TargetFolder | 
    Where {$_.psIsContainer -eq $true} | 
    Where {$_.LastWriteTime -le "$LastWrite1Min"} 
        foreach ($Folder in $Folders)
        {
            $i = $i + 1 
        }

    $Folders = get-childitem -path $TargetFolder | 
    Where {$_.psIsContainer -eq $true} | 
    Where {$_.LastWriteTime -le "$LastWrite2Min"} 

        foreach ($Folder in $Folders)
        {    
            If ($Folder -ne "`0" ){
                $j = $j + 1 
            }     
        }
    $Folders = get-childitem -path $TargetFolder | 
    Where {$_.psIsContainer -eq $true}  |
    Where{ $_.LastWriteTime -le "$LastWrite3Min"} 

        foreach ($Folder in $Folders)
        {
            if($_.LastWriteTime -le "$LastWrite3Min"){
            }
        }
        foreach ($Folder in $Folders)
              {
                  if($_.LastWriteTime -le "$LastWrite3Min")
                  {   
                        $k = $k + 1      
                  }
              }    

    }#end of not zero if 
    #######################################################

    write-host $StringThere $i $StringOne
    write-host $StringThere $j $StringTwo
    write-host $StringThere $k $StringThree
    write-host $exitcode

    exit $exitcode

Мне нужен код выхода, чтобы быть правильным, и цикл for делает это совершенно неправильно. Спасибо!

Julian
источник

Ответы:

0

Здесь версия, которая работает, она может быть улучшена в дальнейшем.

$Now = Get-Date
$TargetFolder = "C:\Temp"
$LastWrite1Min = $Now.AddMinutes(-1)
$LastWrite2Min = $Now.AddMinutes(-2)
$LastWrite3Min = $Now.AddMinutes(-3)
$i=0
$j=0
$k=0

$StringThere = "There are "
$StringOne = "Folder(s) older than 1 Minute"
$StringTwo = "Folder(s) Older than 2 Minute"
$StringThree = "Folder(s) Older than 3 Minute"

$directoryInfo = Get-ChildItem C:\Temp | Measure-Object
#$directoryInfo.count #Returns the the number folders within the directory
If ($directoryInfo.count -eq 0){
write-host "Folder is empty - Good!"
}

##################################################
If ($directoryInfo.count -ne 0)
{
    write-host "Temp has at least one folder present - ... "

    $Folders = get-childitem -path $TargetFolder | 
    Where {$_.psIsContainer -eq $true} 

    foreach ($Folder in $Folders)
    {
        if ($Folder.LastWriteTime -le $LastWrite3Min)
        {
            $k++ 
        }
        elseif ($Folder.LastWriteTime -le $LastWrite2Min)
        {
            $j++
        }
        elseif ($Folder.LastWriteTime -le $LastWrite1Min)
        {
            $i++
        }
    }

}#end of not zero if 
#######################################################

write-host $StringThere $i $StringOne
write-host $StringThere $j $StringTwo
write-host $StringThere $k $StringThree
MickyB
источник