【问题标题】:Advanced syntax高级语法
【发布时间】:2013-09-25 19:07:30
【问题描述】:

我遇到了以下相当高级的语法行(对我来说):

(Get-ADReplicationSubnet -Filter *) -notmatch [String]::Join('|',$c.Subnet)

上面的内容正是我想要的,检索与$c.Subnet 变量不匹配的子网列表。我尝试使用下面的行重新创建相同的效果。这不起作用。

Get-ADReplicationSubnet -Filter * | Where {$_.Name -notmatch $c.Subnet}

我的问题是;有人可以用简单的英语解释第一行是如何工作的吗? (不确定[String]::Join('|',$c.Subnet) 部分。很难搜索您不知道名称的东西。除此之外,为什么我的版本不起作用?

我应该澄清$c.Subnet 是一个值数组。

【问题讨论】:

    标签: powershell syntax


    【解决方案1】:

    [String]::Join('|',$c.Subnet) 是对 .NET 框架的调用——String 类的 Join() 方法。您可以查看文档here

    文档导致对返回值的解释如下:A string that consists of the elements in value delimited by the separator string. If value is an empty array, the method returns String.Empty.

    这意味着您的返回字符串将类似于value1|value2|value3(其中每个value 是来自$c.Subnet 的值),-notmatch 解释为正则表达式,| 表示or。第一行的作用是返回不匹配 value1 value2 value3的值。

    为什么(我认为)您的行不起作用是因为您将-notmatch 与数组而不是字符串一起使用。 This文章有一些关于两者的使用信息。

    【讨论】:

    • 所以这在技术上意味着我可以使用任何分隔符而不是 |?文档链接声明它使用“指定的分隔符”。我不明白的最后一件事;为什么 [String]:: 得到一个带有两个冒号的符号?
    • @SiemHermans 不,您不能使用任何分隔符,| 特定于正则表达式语法,表示匹配其中任何一个。
    • @SiemHermans 您“可以”使用该方法使用您想要的任何分隔符,但是 -notmatch 将不起作用,因为 | 在 Powershell 正则表达式语法中具有特殊含义(仅 |表示-notmatch)。 [String]:: 只是调用 .NET 类 时使用的符号。 [Math]::Pow(2, 2) 调用Math 类的Pow() 方法。
    【解决方案2】:
    [String]::Join('|',$c.Subnet)
    

    [String] 部分表示 .NET 类。

    ::Join 部分意味着调用 String 类的静态方法,即您不必在使用对象之前“新建”一个对象。

    Join 方法接受和数组并将其转换为由管道划定的字符串(在本例中)

    其他人会有一个解释。

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 2023-03-30
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2011-04-15
      • 2020-11-16
      • 1970-01-01
      相关资源
      最近更新 更多