PowerShell中的Contains功能无法正常工作。

7
我试图使用$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
        }

    }   
}

2
“-contains” 用于集合成员资格测试。不过,您也可以使用“-like”或“-match”进行此类测试。 - Etan Reisner
@EtanReisner -match 已经生效了,谢谢! - Bernie
5个回答

23

Contains意味着对数组进行操作。考虑以下示例

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
如果您想查看一个字符串是否包含文本模式,则有几个选项可供选择。其中前两个是`-match`运算符或者`Contains()`字符串方法。
`-match` 运算符是在 If 语句中使用的较简单的示例之一。请注意:`-Match` 支持 .Net 正则表达式,因此请确保不要输入任何特殊字符,否则您可能无法得到您期望的结果。
PS C:\Users\Cameron> "Matt" -match "m"
True

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

-match 默认情况下不区分大小写,因此上面的第一个示例返回 True。第二个示例想匹配 任何 字符,这就是在正则表达式中 . 的作用,这也是它返回 True 的原因。

.Contains()-match 很棒,但对于简单的字符串来说,你可以使用 ....

"123".Contains("2")
True

"123".Contains(".")
False

注意,.Contains() 是区分大小写的。

"asdf".Contains('F')
False

"asdf".Contains('f')
True

奇怪的是,.contains() 的用法类似于数组中的 -contains。 - js2010

1

你可以在一行中完成这个操作:

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)"
}

0

如果您要测试$name是否恰好为'admin',则可以使用-eq比较器。这将检查$name的内容是否等于您指定的字符串'admin'的内容。


0

奇怪的是,.contains() 在数组上的行为类似于 -contains:

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

$a.contains('o')
False

$a.contains

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

0

不区分大小写的使用

'WINLOGON','Something' -contains 'WinLogon'
True

'WINLOGON','Something' -contains 'WINLOGON'
True

'winlogon' -in 'WINLOGON','Something'
True

大小写敏感用法

'WINLOGON','Something' -ccontains 'WinLogon'
False

'WINLOGON','Something' -ccontains 'WINLOGON'
True

'winlogon' -in 'WINLOGON','Something'
True

$Array.Contains('WINLOGON')

不区分大小写 - 全部大写

虽然不是必需的,但可以将所有内容转换为大写以便于比较。

$All = Get-Process -ComputerName $Target | Select-Object -ExpandProperty Name | Select-Object -Unique
$check = @('winLogon', 'Something') 

# not needed but maybe for testing etc. 
$All = $All.ToUpper() # e.g. WINLOGON, W3WP, etc
$Check = $Check.ToUpper() #.e.g. WINLOGON, SOMETHING

If ($All -Contains $Check[0]) { ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接