【问题标题】:PowerShell where objectPowerShell where 对象
【发布时间】:2017-09-29 12:50:25
【问题描述】:

我正在尝试做一些相当简单的事情——我有一个包含多个元素的字符串数组。我想用不包含某个子字符串的元素创建另一个字符串数组。

不幸的是,我同时使用了-notlike-notcontains,我的$l 没有返回任何条目。我希望它返回一个带有“两个”的条目。我怀疑我做错了一些简单的事情,但我无法弄清楚。

$s = "one","two"

Write-Host "s:"

Write-Host "$s"

我已经尝试过 -notlike 和 -notcontains 并且都将 $l 返回为空。我没有同时使用两者。

#$l = Where-Object ($s -notlike "on")

$l = Where-Object ($s -notcontains "on")

Write-Host "l:"

Write-Host "$l"

再次,我希望 $l 返回一个元素“two”,因为“on”与“one”匹配。

【问题讨论】:

  • 我相信一个数组应该这样声明:$s = @('one','two')。接下来,尝试在双引号内加上一个星号:$l = Where-Object ($s -notcontains "*on*")。我不确定这是否真的有效,但你可以尝试一下:) Mark Wragg 发布了一个很好的答案

标签: powershell


【解决方案1】:

-NotLike 可以使用,但您需要在 Where-Object 中的表达式周围使用花括号(您当前正在使用方括号),并且您需要使用 * 作为通配符。

Where-Object 中,您还需要使用$_ 作为变量。这是一个特殊的自动变量,表示管道中正在处理的当前项目(例如,“一”,然后是“二”):

$s = "one","two"
"s: $s"

$l = $s | Where-Object { $_ -notlike "on*"}
"l: $l"

【讨论】:

    【解决方案2】:

    @Mark Wragg 的 cmets 和答案在 -notlike 运算符所需的通配符语法方面非常准确。

    除此之外,Where-Object 子句根本不需要,因为比较运算符在用于数组时也将用作过滤器:

    $s = "one","two"
    "s: $s"
    
    $l = $s -notlike "on*"
    "l: $l"
    

    【讨论】:

    • 我确实尝试过,但它不会导致真/假结果吗?
    • 啊不,我没有用 -notlike 尝试过,我用 -notcontains 尝试过。好答案,投赞成票:)。
    • 如果用于标量(单个项目),它可以作为测试(返回真/假)。当用作数组运算符时,它可以用作过滤器。
    • 如果您的输入有可能从数组变为单个项目,这将成为一个有风险的解决方案。我想你可以通过$l = @($s) -notlike "on*" 来解决这个问题
    • 可能会产生意想不到的后果。您可以通过显式强制 LH 侧为数组来缓解这种情况,例如$l = @($s) -notlike "on*"
    猜你喜欢
    • 2019-02-17
    • 2020-09-29
    • 2020-05-29
    • 2018-11-30
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多