powershell包含不工作

koaltpgm  于 2023-03-08  发布在  Shell
关注(0)|答案(5)|浏览(134)

我尝试使用$Share.Name按每个共享的名称过滤。但是,当我尝试在下面的if语句中使用-contains时,没有得到任何结果。
我想要的结果应该是ADMIN$ - C:\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
        }

    }   
}
kx7yvsdv

kx7yvsdv1#

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

如果你想知道一个 string 是否包含一个文本模式,那么你有几个选择,前两个是-match操作符或者.Contains()字符串方法

  1. -match是在and If语句中使用的较简单的示例之一。* 注意:* -Match支持.Net正则表达式,因此请确保不要输入任何特殊字符,否则可能无法获得预期的结果。
PS C:\Users\Cameron> "Matt" -match "m"
True

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

-match在默认情况下不区分大小写,因此上面的第一个示例返回True。第二个示例查找匹配 any 字符,这是.在regex中表示的内容,这也是它返回True的原因。

  1. .Contains()-match非常棒,但是对于简单的字符串,您可以......
"123".Contains("2")
True

"123".Contains(".")
False

请注意,.Contains()区分大小写

"asdf".Contains('F')
False

"asdf".Contains('f')
True
yv5phkfx

yv5phkfx2#

您可以在一行中完成此操作:

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

n9vozmp43#

如果您正在测试$name是否确实为“admin”,则可以使用-eq比较器。该比较器将检查$name的内容是否等于指定字符串“admin”的内容

wooyq4lh

wooyq4lh4#

奇怪的是,.contains()在数组中的作用就像-contains:

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

$a.contains('o')
False

$a.contains

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

1szpjjfi5#

用法不区分大小写

'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]) { ...

相关问题