【问题标题】:Strange behavior of PowerShell matching against array string elementPowerShell与数组字符串元素匹配的奇怪行为
【发布时间】:2014-03-26 13:43:36
【问题描述】:

我非常渴望这里的提示。这是我的困惑:

首先,我有一个字符串数组,我是这样创建的(显示数字的子集):

$a = @"
00013120747
00013051436
00013110491
00002100011
"@

$aa = $a.Split("`n")

接下来,我以这种方式(使用 ActiveRoles)生成 Active Directory 中所有用户的列表:

$all_u = Get-QADUser -DontUseDefaultIncludedProperties -IncludedProperties Name,LogonName,EmployeeID -SizeLimit 0

现在,为什么我不能匹配 $aa 数组的元素?例如,执行以下操作:

$all_u | where {$_.EmployeeID -match "00013110491"}

它有效。但如果我执行以下操作:

$all_u | where {$_.EmployeeID -match $aa[2]}

它不起作用。

所以我做了一个更简单的测试:

$aa.GetType().Name
String[]

$aa[2].GetType().Name
String

$aa[2]
00013110491

$aa[2] -eq "00013110491"
False

什么?这是怎么回事???

顺便说一下,我正在使用 PowerShell ISE。

【问题讨论】:

    标签: arrays powershell powershell-3.0 powershell-ise


    【解决方案1】:

    如果您仔细检查 $aa 的元素,您会发现它们都有尾随空格。这是对“`n”进行拆分的结果。如果在拆分后修剪它们,您将获得预期的结果。

    $a = @"
    00013120747
    00013051436
    00013110491
    00002100011
    "@
    
    $aa = $a.Split("`n") |% {$_.trim()}
    
    $aa[2] -eq "00013110491"
    
    True
    

    -match 将匹配字符串中的任何位置,因此即使有尾随空格它仍然会匹配。 -eq 要求和完全匹配,字符对字符,尾随空格将导致它返回 False。

    【讨论】:

    • 哇,不错的发现!我实际上尝试了foreach ($elem in $aa) { "=={0}==" -f $elem } 并且每一行都没有显示任何尾随空格。谢谢你告诉我!将您的答案标记为答案。
    【解决方案2】:
    $a = @"
    00013120747
    00013051436
    00013110491
    00002100011
    "@
    
    $aa = $a.Split("`r`n")
    

    【讨论】:

      【解决方案3】:

      您正在使用此处的字符串。像这样的语法:

      $String = @"
      entry1
      entry2
      entry3
      "@
      
      $String.Count
       >1
      

      您需要先拆分您的此处字符串,然后才能比较它们。如果您查看运行时实际得到的结果

       $a[2]
       > '0'
      

      您正在向 PowerShell 询问第二个索引位置。就是这个意思。 00[0]13120747

      这是因为 here-string 是一个单独的字符串,它恰好包含多行。使用 PowerShell 数组索引,如果只有一个条目,您将从列表中取回该位置。

      $string = "0123456"
      $string[0..2]
       >012
      

      【讨论】:

      • 你没看到我确实做到了这一点吗? $aa = $a.Split("`n")
      • 我错过了。看起来 Mjolinor 在这里是正确的,这似乎是 ISE 中的一个错误,在每个字符的末尾注入了一个空格。检查每个条目的长度,它们在 ISE 中为 12 个字符,而在控制台中工作时为 11 个。
      猜你喜欢
      • 2018-06-13
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      相关资源
      最近更新 更多