2016-12-14 2 views
1

Последующие меры по этому вопросу: How to get a value in a foreach loop into a sum?Как игнорировать нулевые значения в foreach в powershell?

У меня есть этот фрагмент Powershell кода:

$TotalHomeDirSizeMB = 0 
foreach ($user in $ListofUsers) 
{ 
    # Calculate sum of file sizes, grab Sum property value directly 
    $HomeDirSize = (Get-ChildItem $user.HomeDirectory -Recurse | Measure-Object -Property length -sum).Sum 

    # Calculate and store size in MB 
    $HomeDirSizeMB = "{0:N2}" -f ($HomeDirSize/1MB) 
    # Add to cumulative size variable 
    $TotalHomeDirSizeMB += $HomeDirSizeMB 

    # Write results to screen + file 
    Write-Host "`r`n Size of:" $user.HomeDirectory 
    Write-Host ("{0:N2} MB" -f $HomeDirSizeMB) 
    "$($user.HomeDirectory) = $HomeDirSizeMB MB" | Out-File $LogFileName -Append 

    # Remove Home Directory 
    Remove-Item $user.HomeDirectory -Force -Recurse -ErrorAction SilentlyContinue 
    Write-Host "`r`n Removed HomeDirectory: " $user.HomeDirectory 

    # Wait for user to verify deletion from AD, preempt Confirmation if verified 
    Write-Host "`r`n Verifying you want to remove the user: " $user.Name -ForegroundColor Yellow -BackgroundColor Red 
    if ((Read-Host -Prompt "y for yes") -eq 'y'){ 
     Remove-ADObject $user.DistinguishedName -Confirm:$false 
    } 
} 
Write-Host "Removed $TotalHomeDirSizeMB MB" 

Мне нужен способ иметь дело с сценарий не erroring, если HomeDirectory пользователя в этом атрибуте AD NULL ,

Я думал, что это будет встроенный оператор IF ниже foreach, но я не могу заставить оператор If работать правильно, я продолжаю получать синтаксические ошибки.

Может ли кто-нибудь помочь в выполнении инструкции IF, чтобы убедиться, что код foreach работает только в том случае, если HomeDirectory имеет значение?

+0

Привет, пожалуйста, покажите нам свою попытку с 'if' блока (изменить ваш вопрос), это довольно легко, вы должны помочь очень скоро. – sodawillow

+0

@sodawillow - я делал, если {$ _. HomeDirectory -ne $ null}, но все равно будет ошибка, если атрибут был пустым ... не знаю, почему – TheCleaner

+1

Вам нужны parens '()' вместо фигурных скобок '{} ' – sodawillow

ответ

1

Здесь:

$TotalHomeDirSizeMB = 0 
foreach ($user in $ListofUsers) 
{ 
    if ($user.HomeDirectory) { 
     # Calculate sum of file sizes, grab Sum property value directly 
     $HomeDirSize = (Get-ChildItem $user.HomeDirectory -Recurse | Measure-Object -Property length -sum).Sum 

     # Calculate and store size in MB 
     $HomeDirSizeMB = "{0:N2}" -f ($HomeDirSize/1MB) 
     # Add to cumulative size variable 
     $TotalHomeDirSizeMB += $HomeDirSizeMB 

     # Write results to screen + file 
     Write-Host "`r`n Size of:" $user.HomeDirectory 
     Write-Host ("{0:N2} MB" -f $HomeDirSizeMB) 
     "$($user.HomeDirectory) = $HomeDirSizeMB MB" | Out-File $LogFileName -Append 

     # Remove Home Directory 
     Remove-Item $user.HomeDirectory -Force -Recurse -ErrorAction SilentlyContinue 
     Write-Host "`r`n Removed HomeDirectory: " $user.HomeDirectory 
    } 

    # Wait for user to verify deletion from AD, preempt Confirmation if verified 
    Write-Host "`r`n Verifying you want to remove the user: " $user.Name -ForegroundColor Yellow -BackgroundColor Red 
    if ((Read-Host -Prompt "y for yes") -eq 'y'){ 
     Remove-ADObject $user.DistinguishedName -Confirm:$false 
    } 
} 
Write-Host "Removed $TotalHomeDirSizeMB MB" 
1
foreach ($user in $ListofUsers) 
{ 
    if ($user.HomeDirectory) { 
     your original code 
    } 
} 

Это будет проверять, если $user.HomeDirectory не $null

+0

Привет, это приведет к ошибкам, если '$ user.HomeDirectory'' $ null', как хочет OP. Вам придется протестировать '$ user.HomeDirectory'. – sodawillow

+0

Я думал, что он хочет проверить ответ от gci – 4c74356b41

+0

_if, так как исходный код пользователя NULL в этом атрибуте AD_ – sodawillow

2

Мне лично нравится предварительной фильтрации, так что вы не должны оценить во время каждого прохода с помощью если. Я считаю, что это более легко читаемый/сжатый, а также держит код от заголовка в направлении «pyramid of doom».

Это работает, если весь код внутри цикла зависит только от того, что этот единственный атрибут установлен (и без него вы не заинтересованы).

$FilteredListOfUsers = $ListofUsers | ?{$_.HomeDirectory -ne $null} 
foreach ($user in $FilteredListOfUsers) { #do work...} 

Это, как говорится, работа первого ответчика одинаково правильна.