【问题标题】:powershell contains not workingpowershell 包含不工作
【发布时间】:2015-06-08 19:31:44
【问题描述】:

我正在尝试使用 $Share.Name 按每个共享的名称进行过滤。但是,当我尝试在下面的 if 语句中使用 -contains 时,我没有得到任何结果。

我想要的结果应该是 ADMIN$ - C:\ADMIN$

我正在努力获得如下变量: $ExcludeShares = "ADMIN$" 并根据 $String.Name 是否在 $ExcludeShares 中进行过滤

我愿意接受有关过滤此问题的其他方法的想法。

提前致谢!

function GetAllUsedShares{
    [psobject]$Shares = Get-WmiObject -Class win32_share
    Foreach($Share in $Shares){
        $name = [string]$Share.Name
        if ($name -contains 'admin'){
            Write-Host $Share.Name - $Share.Path
        }

    }   
}

【问题讨论】:

  • -contains 用于收藏会员资格。不过,您可以使用-like-match 进行此类测试。
  • @EtanReisner -match 工作,谢谢!!

标签: powershell if-statement filtering contains


【解决方案1】:

奇怪的是,.contains() 的作用类似于数组上的 -contains:

$a = 'one','two','three'
$a.contains('one')
True

$a.contains('o')
False

$a.contains

OverloadDefinitions
-------------------
bool IList.Contains(System.Object value)

【讨论】:

    【解决方案2】:

    包含用于处理数组。考虑以下示例

    PS C:\Users\Cameron> 1,2,3 -contains 1
    True
    
    PS C:\Users\Cameron> "123" -contains 1
    False
    
    PS C:\Users\Cameron> "123" -contains 123
    True
    

    如果您要查看 string 是否包含文本模式,那么您有几个选择。前 2 个是 -match 运算符或 .Contains() 字符串方法

    1. -match 将是在 if 语句中使用的更简单的示例之一。 注意:-Match 支持 .Net 正则表达式,因此请确保不要输入任何特殊字符,因为您可能无法获得预期的结果。

      PS C:\Users\Cameron> "Matt" -match "m"
      True
      
      PS C:\Users\Cameron> "Matt" -match "."
      True
      

      -match 默认情况下不区分大小写,因此上面的第一个示例返回 True。第二个例子是寻找匹配 any 字符,这是 . 在正则表达式中所代表的,这也是它返回 True 的原因。

    2. .Contains():-match 很棒,但是对于简单的字符串,您可以....

      "123".Contains("2")
      True
      
      "123".Contains(".")
      False
      

      注意.Contains() 区分大小写

      "asdf".Contains('F')
      False
      
      "asdf".Contains('f')
      True
      

    【讨论】:

    • 奇怪的是 .contains() 的工作方式类似于 -contains 在数组上。
    【解决方案3】:

    你可以在一行中做到这一点:

    Get-WmiObject -Class win32_share | where -Property Name -like "*admin*" | % { "$($_.Name) - $($_.Path)" }
    

    不要忘记 where 语句中的星号。在这种情况下,它会寻找准确的值。

    如果你想把它写出来,这也是一样的:

    $shares = Get-WmiObject -Class win32_share
    
    # I pipe the $shares collection into the where-object command to filter on "admin"
    $adminshares = $shares | where -property Name -like "*admin*"
    
    # now we can loop with a foreach, which has the "%" operator as it's shorthand in the oneliner
    foreach ($share in $adminshares) 
    {
        # variables in strings are a bit weird in powershell, but you have to wrap them like this
        write-host "$($share.Name) - $($share.Path)"
    }
    

    【讨论】:

      【解决方案4】:

      如果您正在测试 $name 的“管理员”,您可以使用 -eq 比较器。这将检查 $name 的内容是否等于您指定的字符串 'admin' 的内容

      【讨论】:

        猜你喜欢
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        相关资源
        最近更新 更多