2014-03-26 63 views
0

我對這裏的提示非常絕望。這裏是我的困惑:PowerShell與數組字符串元素匹配的奇怪行爲

首先,我有一個字符串數組,這是我創造了這個方式(顯示號碼的子集):

$a = @" 
00013120747 
00013051436 
00013110491 
00002100011 
"@ 

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

接下來,我產生的所有用戶的Active Directory中的列表(使用ActiveRoles)這樣說:

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

回答

2

如果仔細檢查$ aa的元素,您會發現它們都有尾隨空格。這是對「`n」進行拆分的結果。如果您在完成拆分後修剪它們,則會得到預期結果。

$a = @" 
00013120747 
00013051436 
00013110491 
00002100011 
"@ 

$aa = $a.Split("`n") |% {$_.trim()} 

$aa[2] -eq "00013110491" 

True 

-match將匹配字符串中的任何位置,所以即使匹配尾部空格也是如此。 -eq需要和完全匹配,字符爲character,尾隨空格將導致它返回False。

+0

哇,很好找!我實際上嘗試了'foreach($ aa $ aa){「== {0} ==」-f $ elem}',並且每行不顯示任何尾部空格。謝謝你告訴我!標記你的答案。 – pepoluan

1
$a = @" 
00013120747 
00013051436 
00013110491 
00002100011 
"@ 

$aa = $a.Split("`r`n") 
+0

Aaah,我明白了......需要在'r上分開...... – pepoluan

-2

您正在使用here字符串。這樣的語法:

$String = @" 
entry1 
entry2 
entry3 
"@ 

$String.Count 
>1 

您需要先分割您的這裏字符串,然後才能比較它們。如果你看看你在運行時得到了什麼

$a[2] 
> '0' 

你在問PowerShell的第二個索引位置。這意味着這一點。 00 [0] 13120747

這是因爲here-string是單個字符串,它恰好包含多行。使用PowerShell數組索引,如果只有一個條目,您將從列表中取回該位置。

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

你沒看見我完成了嗎? $ aa = $ a.Split(「'n」) – pepoluan

+1

我錯過了。看起來Mjolinor在這裏是正確的,這似乎是ISE中的一個錯誤,在每個角色的末端都注入了空間。檢查每個條目的長度,他們在ISE中的長度是12個字符,而在控制檯中工作時是11個字符。 – FoxDeploy