2016-12-14 32 views
1

跟進這個問題:How to get a value in a foreach loop into a sum?如何在PowerShell中的foreach中忽略空值?

我有這個片段的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" 

我需要一種方法來處理腳本不示數出來,如果用戶的home目錄是在這個AD屬性NULL 。

我認爲這將是一個嵌入式IF語句低於foreach,但我不能讓If語句正常工作,我不斷收到語法錯誤。

任何人都可以協助什麼IF語句將確保只有在HomeDirectory有值的情況下運行foreach代碼?

+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

如果用戶的home目錄在這個AD屬性中爲NULL – sodawillow

2

我個人喜歡預過濾器,這樣你不必使用如果每個過程中來評價。我覺得這樣更容易閱讀/簡潔,並且保持代碼不向「pyramid of doom」前進。

如果循環內的所有代碼僅依賴於設置的這個單一屬性(以及沒有它的用​​戶不感興趣),那麼這起作用。

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

話雖這麼說,第一個響應者的工作同樣正確。