powershell contains not working

后端 未结 4 939
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-27 00:36

I am trying filter by the name of each share using $Share.Name. However, when I try to use -contains in the if statement below, I get no r

相关标签:
4条回答
  • 2021-01-27 01:00

    Contains is meant to work against arrays. Consider the following examples

    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
    

    If you are looking to see if a string contains a text pattern then you have a few options. The first 2 would be -match operator or the .Contains() string method

    1. -match would be one of the simpler examples to use in and If statement. Note: -Match supports .Net regular expressions so be sure you don't put in any special characters as you might not get the results you expect.

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

      -match is not case sensitive by default so the first example above returns True. The second example is looking to match any character which is what . represents in regex which is why it returns True as well.

    2. .Contains(): -match is great but for simple strings you can ....

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

      Note that .Contains() is case sensitive

      "asdf".Contains('F')
      False
      
      "asdf".Contains('f')
      True
      
    0 讨论(0)
  • 2021-01-27 01:04

    Bizarrely, .contains() acts like -contains on arrays:

    $a = 'one','two','three'
    $a.contains('one')
    True
    
    $a.contains('o')
    False
    
    $a.contains
    
    OverloadDefinitions
    -------------------
    bool IList.Contains(System.Object value)
    
    0 讨论(0)
  • 2021-01-27 01:16

    You can do this in one line:

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

    Don't forget the asterisks in the where statement. It looks for exact values in that case.

    If you want to write it out, this does the same thing:

    $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)"
    }
    
    0 讨论(0)
  • 2021-01-27 01:18

    If you are testing $name for exactly 'admin' you can use the -eq comparator. This checks if the contents of $name equal the contents of your specified string 'admin'

    0 讨论(0)
提交回复
热议问题