如何在PowerShell中的foreach中忽略空值?
跟进这个问题: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代码?
这里:
$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"
foreach ($user in $ListofUsers)
{
if ($user.HomeDirectory) {
your original code
}
}
这将检查是否$user.HomeDirectory
不$null
嗨,这将输出错误如果$ user.HomeDirectory'是'$ null'作为OP想要的。你不得不测试'$ user.HomeDirectory'。 – sodawillow
我以为他想检查来自gci的响应 – 4c74356b41
如果用户的home目录在这个AD属性中为NULL – sodawillow
我个人喜欢预过滤器,这样你不必使用如果每个过程中来评价。我觉得这样更容易阅读/简洁,并且保持代码不向“pyramid of doom”前进。
如果循环内的所有代码仅依赖于设置的这个单一属性(以及没有它的用户不感兴趣),那么这起作用。
$FilteredListOfUsers = $ListofUsers | ?{$_.HomeDirectory -ne $null}
foreach ($user in $FilteredListOfUsers) { #do work...}
话虽这么说,第一个响应者的工作同样正确。
你好,请给我们用'if'块的尝试(编辑你的问题),它是相当容易的,你有帮助很快。 – sodawillow
@sodawillow - 我在做如果{$ _。HomeDirectory -ne $ null},但是如果该属性是空的,它仍然会出错......不知道为什么 – TheCleaner
您需要parens'()'而不是大括号'{} ' – sodawillow