【问题标题】:How to ignore null values in a foreach in powershell?如何在powershell中忽略foreach中的空值?
【发布时间】:2016-12-14 20:40:37
【问题描述】:

跟进这个问题:How to get a value in a foreach loop into a sum?

我有这个 Powershell 代码的 sn-p:

$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"

如果用户的主目录在此 AD 属性中为 NULL,我需要一种方法来处理不出错的脚本。

我以为它会是 foreach 下方的嵌入式 IF 语句,但我无法让 If 语句正常工作,我不断收到语法错误。

谁能协助说明 IF 语句是什么,以确保 foreach 代码仅在 HomeDirectory 具有值时运行?

【问题讨论】:

  • 您好,请向我们展示您对if 块的尝试(编辑您的问题),这很容易,您很快就会得到帮助。
  • @sodawillow - 我在做 if {$_.HomeDirectory -ne $null} 但如果属性为空,它仍然会出错......不知道为什么
  • 你需要括号 () 而不是花括号 {}
  • 哇!谢谢楼主

标签: powershell foreach null


【解决方案1】:

我个人喜欢预过滤,这样您就不必在每次通过时使用 if 进行评估。我发现这更容易阅读/简洁,并且还可以防止代码指向“pyramid of doom”。

如果循环中的所有代码仅依赖于设置的单个属性(以及您不感兴趣的那些没有它的属性),则此方法有效。

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

话虽如此,第一响应者的工作同样正确。

【讨论】:

    【解决方案2】:

    这里:

    $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"
    

    【讨论】:

      【解决方案3】:
      foreach ($user in $ListofUsers)
      {
          if ($user.HomeDirectory) {
              your original code
          }
      }
      

      这将检查$user.HomeDirectory 是否不是$null

      【讨论】:

      • 嗨,如果$user.HomeDirectory 是 OP 想要的$null,这将输出错误。您必须改为测试 $user.HomeDirectory
      • 我以为他想检查 gci 的响应
      • 如果用户的主目录在此 AD 属性中为 NULL
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2011-10-01
      • 2021-11-01
      • 1970-01-01
      • 2022-10-25
      相关资源
      最近更新 更多