【问题标题】:How to do a -Contain -Not : String contains "Anything other than"如何执行 -Contain -Not :字符串包含“除此之外的任何内容”
【发布时间】:2016-09-30 22:28:36
【问题描述】:

如何编写“字符串是否包含 -not _”/“字符串是否包含除 _ 以外的任何内容”的脚本?

我没有陷入困境,因为我找到了足够好的解决方法。好奇心胜过一切。

例子:

$String = 1,1,1,2,5
$String -contains !(1)

这总是假的

我目前的解决方案是删除 1 并查看它是否为 null,如下所示:

$String2 = $String -ne 1
if ([String]::IsNullOrEmpty($String2)) {
    Write-Host "True"
} else {
    Write-Host "False"
}

现实世界的例子:

我的脚本旨在尝试某个操作,直到它起作用。在这种情况下,获取 msoluser。 在我的脚本结束时,我想计算任何错误(并稍后列出),但总会有一个为“get-msoluser”列出的错误,因为它在它工作之前会失败。所以我试图在计数中不包括那个特定的错误。

$Errors = $Error.InvocationInfo.MyCommand.Name
if ($Errors -contains !("get-msoluser")) {
    Write-Host "There was an error I actually care about"
}

我必须这样做:

$Errors = $Error.InvocationInfo.MyCommand.Name
$ErrorsICareAbout = $Errors -ne "get-msoluser"
if ([String]::IsNullOrEmpty($ErrorsICareAbout)) {
    Write-Host "$ErrorsICareAbout.Count"
} else {
    Write-Host "There were errors you actually cared about"
}

我错过了什么就在我眼皮底下吗?

【问题讨论】:

  • 你试过If (!($Errors -contains ("get-msoluser")))
  • 是的。就在我的鼻子底下。谢谢!
  • -notcontains 是您要查找的运算符。

标签: powershell


【解决方案1】:

您只需要使用-notcontains 或在整个-contains 比较周围添加not 运算符,如下所示:

If ($Errors -notcontains ("get-msoluser"))

If (!($Errors -contains ("get-msoluser")))

【讨论】:

    【解决方案2】:

    与其过滤掉错误,不如一开始就尝试不产生错误。要抑制来自特定命令的错误,您可以将错误操作设置为 SilentlyContinue。

    Write-Error 'fail' -ErrorAction SilentlyContinue
    

    因此,在 Get-MsOlUser 工作之前重试的情况下,您可以使用类似

    while($msolUser -eq $null) {
       $msolUser = Get-MsOlUser ... -ErrorAction SilentlyContinue
    
       #Wait a second before retrying.
       Start-Sleep -Seconds 1   
    }
    
    #Now work with $msolUser
    

    (您可能还想设置重试次数的上限)

    【讨论】:

    • 我目前正在使用它来抑制 powershell 屏幕上的错误,但它似乎仍会进入 $error 变量。第二次重试后由运行它的人手动操作,并带有“继续”取消弹出按钮。
    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2011-10-25
    • 2021-09-21
    • 2019-07-20
    相关资源
    最近更新 更多