【问题标题】:Powershell AD Syntax - If Statement is duplicating a stringPowershell AD 语法 - If 语句正在复制字符串
【发布时间】:2021-01-01 01:51:17
【问题描述】:

新的脚本编写者希望能够轻松校对。

我制作了一个 Powershell Active Directory 脚本,该脚本根据我获得的每日 CSV 文件处理组织内的休假 (LOA) 人员。

总的来说,我的问题部分应该:

  • 如果员工“休假”,请检查 $Line 变量的 currentStatus
  • 禁用该 Active Directory 帐户。
  • 获取该 AD 帐户的“描述”字段并查找字符串部分“LOA -”并仅在缺失时添加。问题是如果该字段中已经包含“LOA -”描述,它放了另一个……和另一个,依此类推。

例子:

  • 描述(良好):LOA - 厨师
  • 描述(错误):LOA - LOA - 厨师
  • 描述(请不要):LOA - LOA - LOA - 厨师

我很确定问题出在这条线上,但我不知道如何解决它。

如果 ($null -ne ($newDescript | ? {$loaPhrases -notcontains $_}))

$loaPhrases = "LOA -|LOA-|LOA - |LOA- |LOA - LOA - "

ElseIf ($Line.currentStatus -eq "ON LEAVE") 
{
    #Add 'LOA - ' to description and disable AD
    Set-ADUser $User.samAccountName -Enabled 0
    'Disabled AD'

    $Description = Get-ADUser $User.samAccountName -Properties Description | Select-Object -ExpandProperty Description
    $newDescript = $Description.substring(0, $Description.IndexOf('-')+1)
    If ($null -ne ($newDescript | ? {$loaPhrases -notcontains $_}))
    {
        $Description = "LOA - " + "$Description"
        $Description = $Description.trim()
        Set-ADUser $user.samAccountName -Description $Description
    }  
}                                          

【问题讨论】:

  • 您是否总是希望“LOA”开始描述?我同意@Guy S 的评估,但您可能需要改进 RegEx,

标签: powershell if-statement syntax active-directory


【解决方案1】:

看起来你有点过于复杂了。尝试使用 -match 语句来匹配您的 $loaPhrases 的正则表达式.....

if ($description -notmatch $loaPhrases)

这可以通过更高级的编辑和检查来完成,但基本上会检查您的正则表达式字符串(由 | 分隔,就像您一样)以查找 loa 字符串。如果它不存在,它会添加“LOA -”部分。

编辑:添加选项以简单地查看字符串的开头

正如 Steven 在 cmets 中指出的那样,您可能正在寻找描述开头的 LOA 字符串以确定是否需要添加一个。由于所有 LOA 字符串都以“LOA”开头,因此您可以只需检查以确保它不以“LOA”开头,以确定是否需要添加它。

if (!($description.startswith("LOA")))

!翻转了$description.startswith("LOA")返回的布尔值,所以如果它确实以“LOA”开头,则返回false,如果不以“LOA”开头,则返回true,并进入if 声明。

顺便说一句,在早些时候,您设置了-Enabled 0。为了便于阅读,我的建议是将其更改为 -Enabled $false,因为它清楚地表明您正在禁用该帐户,而不是将其设置为整数(即​​使这有效 / 0 通常为“假”)。

【讨论】:

  • 我喜欢你的补充,但是,重要的是要指出 .StartsWith().EndWith() 区分大小写。 `-notmatch "^LOA" 可能是最好的方法。
  • 这是杰出的 Guy S,非常感谢。是的,您是对的,LOA 将位于字符串的开头。我使用了我的“$loaPhrases”变量,因为这不是从一开始就编写好的脚本,而且我不得不考虑一些人为的拼写错误。但这绝对有效,感谢您提供有关 -Enabled 状态的提示。
【解决方案2】:

Guy S's Helpful Answer 为基础,考虑到您是新手,我想补充几点。

考虑到您要更改多个属性,您可能会考虑使用不同的方法来设置用户对象。对于 Active Directory cmdlet,有一个我非常喜欢的实例化功能。这种方法可能如下所示:

ElseIf ($Line.currentStatus -eq "ON LEAVE") 
{    
    # Get and store the instance in a variable:
    $ADUser = Get-ADUser $User.samAccountName -Properties Description
    
    $ADUser.Enabled = $false # Change the desired properties...
    Write-Host 'Disabled AD'

    If( $ADUser.Description -notmatch $loaPhrases )
    {
        $ADUser.Description = "LOA - " + $ADUser.Description.Trim()
    }

    # After changing properties run a single set command citing -Instance:
    Set-ADUser -Instance $ADUser    
}

注意,我使用了Write-Host 而不是仅仅引用“禁用 AD”。在自上而下的脚本中,这可能没什么大不了的,但是如果此代码在函数内部,则将返回该字符串。这会导致变体数组、意外的函数返回和相关问题。同样,这里不一定是问题,但您需要注意这一点。事实上,随着人们对 PowerShell 的掌握程度越来越高,这是一个常见的困惑。

我看到-Instance 不喜欢空值的异常情况。但是,Description 属性似乎没有这个问题。喷溅可能是另一种选择,并且在比这稍微复杂一些的情况下非常有用......阅读更多关于喷溅的信息here

我还想多谈谈您的原始代码和后续示例。

第一个-contains-in 和它们的“not”变体在字符串上效果不佳。例如,"string" -contains "ing" 将返回“False”。因此,从概念上讲,该方法与您尝试做的事情不匹配。大多数人会使用-match,这是一种基于正则表达式的方法。

注意:对于简单的东西-Like 可以使用不太健壮的通配符方法。在您的情况下,-match 是您最好的选择,因为匹配字符串的变化"

-contains-in 非常适合检查数组和其他集合:

$Array = "One", "Two"

$Array -contains "one"

"one" -in $Array

以上,-contains-in 都将返回“True”

鉴于您要搜索字符串开头的指示,我将修改正则表达式以使用“^”锚,例如:$loaPhrases = "^LOA -|^LOA-|^LOA - |^LOA- |^LOA - LOA - " 想想看,一个简单的"^LOA" 可能会成功。 关于盖伊的回答,我会避免 .StartsWith() 或就此而言 .EndsWith() 只是因为它们区分大小写。

最后,我要指出与$null 的比较是不必要的,即使除了其他问题。

$Array = "One", "Two"
If( ( $Array | Where-Object{ $_ -eq "Three"} ) ){
    "Something"
}

在上面的例子中,“Something”不会被回显到屏幕上。如果您将“三”更改为“二”,它会。

【讨论】:

  • 我不会说这里的大部分词汇现在超出我的理解范围,但感谢您在这里的建议和提示!干杯
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2016-07-17
  • 1970-01-01
相关资源
最近更新 更多