1

我发现 PowerShell 字符串有一些不寻常的地方......我希望这只是我所缺少的。这是我发现的。

我从网页复制了一些数据(如果有人关心,KQL 会搜索 O365),它包含隐藏的控制字符。这是我将它们存储在 PowerShell 变量中的两行:

PS C:\Users> $L1 = "(c:c)(date=01/01/2014..11/01/2016)"
PS C:\Users> $L2 = "(c:c)‎‎(date=01/01/2014..11/01/2016)‎"

第二行在“(c:c)”和“(date”之间有两个隐藏字符(Unicode字符8206)。我相信它们仍然存在于这篇文章中。因此,两个字符串具有不同的长度:

PS C:\Users> $L1.Length
34

PS C:\Users> $L2.Length
36

然而,当我检查它们是否彼此相等时,PowerShell 告诉我它们是:

PS C:\Users> $L1 -eq $L2
True

现在,我知道它明白那里存在差异。我可以使用 substring 方法拉出一些字符,并显示子字符串不相等:

PS C:\Users> $L1.Substring(4,8)
)(date=0

PS C:\Users> $L2.Substring(4,8)
)‎‎(date

如果我使用 -eq 运算符比较这些子字符串,我会得到正确的答案:

PS C:\Users> $L1.Substring(4,8) -eq $L2.Substring(4,8)
False

但是,如果我通过更改我抓取的字符数来强制字符串显示相同,因此我得到相同的 6 个可见字符,那么 PowerShell 会告诉我它们是相等的:

PS C:\Users> $L1.Substring(4,6)
)(date

PS C:\Users> $L2.Substring(4,8)
)‎‎(date

PS C:\Users> $L1.Substring(4,6) -eq $L2.Substring(4,8)
True

那么,这是预期的行为吗?我错过了什么吗?我已经编程了足够长的时间,以至于我知道字符串处理可能很奇怪……但这超出了我的个人经验。

如果这是预期的行为,我如何正确比较两个字符串变量以查看它们是否完全相同?

4

0 回答 0