.contains()vs -contains,一个返回true,其他返回false

时间:2018-09-05 06:53:12

标签: powershell

我有一个像这样的哈希表:

$Path = @{
    "BM"    = "\\srv\xy"
    "BB4-L" = "\\srv\xy"
    "BB4-R" = "\\srv\xy"
    "HSB"   = "\\srv\xy"
    "IB"    = "\\srv\xy"
    "LM1"   = "\\srv\xy"
    "LM2"   = "\\srv\xy"
    "sis"   = "\\srv\xy"
}

我的$env:username是sis。为什么.contains()-contains有所不同?

PS Z:\Powershell-Scripts\Functions> $Path -contains $env:username
False

PS Z:\Powershell-Scripts\Functions> $Path.contains($env:username)
True

如果可能的话,我总是喜欢使用PowerShell语法,但是在这种情况下我不能这样做,因为-contains会返回false。

.contains()-contains有何不同?

3 个答案:

答案 0 :(得分:1)

摘自MS文档:

-Contains
      Description: Containment operator. Tells whether a collection of reference
      values includes a single test value. Always returns a Boolean value. Returns TRUE
      only when the test value exactly matches at least one of the reference values. 

.Contains()方法是支持子字符串的String对象的方法之一,因此为什么 True,当您运行$Path.Contains($env:username)

答案 1 :(得分:1)

$PathSystem.Collections.Hashtable。您还可以阅读以下文档:

  

当测试值为集合时,Contains运算符使用   参考平等。仅当引用之一时才返回TRUE   值是测试值对象的相同实例。

哈希表中的每个项目均为System.Collections.DictionaryEntry。您正在将其与string进行比较。由于类型不匹配,因此引用也不匹配。 Contains(System.Object key)ContainsKey(System.Object key)使用键进行测试。为了使比较一致,您应该写:

$Path.Keys -contains $env:username

答案 2 :(得分:0)

我通过将hashtable.containskey更改为-contains来使代码工作。在以下代码片段中,我注释了包含.containsKey($ UserIDFromAD)的行,并添加了包含$ UserIDsFromFile.keys-包含$ UserIDFromAD的行。该代码现在可以按预期工作。

那么,.containskey和-contains之间有什么区别?

import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class intf extends JInternalFrame {
    public intf () {
        super("Document", 
                  true, //resizable
                  true, //closable
                  true, //maximizable
                  true);//iconifiable

        JPanel jp = new JPanel();
        JLabel jl = new JLabel("Hi I'm a label");
        jp.add(jl);
        this.add(jp);
        this.pack();
        this.repaint();
    }
}