Partial string match on a list

I am using the script from DPM 2010. PowerShell Script to auto protect VMs as they get added to a CSV Cluster | Cloudtidings.com to auto add new VM’s to my DPM Protection Group.

I need to have a list of VM’s to exclude from being auto added to the group.

Outside this section

foreach ($ds in $unprotectedDSList)
{
write-host “Adding data source” $ds.Name “to” $MPG.FriendlyName
$npg = Add-ChildDatasource -ProtectionGroup $MPG -ChildDatasource $ds

# 12.1 Disk Allocation is skipped in case of short term protection being to tape.
if($MPG.protectionmethod -eq $tape) {continue;}
$x = Get-DatasourceDiskAllocation -Datasource $ds
Set-DatasourceDiskAllocation -Datasource $ds -ProtectionGroup $MPG

}

I need to have a list of servers (something like $VMsToIgnore = @(“SQL01”, “EXCH01”)) and test them against $ds.Name within the loop to see if there’s a match. The trouble is that $ds.Name may be “Offline\EXCH01” or “Online\EXCH01” so I can’t do a direct -compare against my list.

How would I do the check?

There are several ways. One approach I’ve used for this kind of thing in the past is to convert the array into a single regex, which can be used with the -match or -notmatch operators:

$VMsToIgnore = @('SQL01', 'EXCH01') 
$pattern = ($VMsToIgnore | ForEach-Object { [regex]::Escape($_) }) -join '|'

foreach ($ds in $unprotectedDSList)
{
    if ($ds.Name -match $pattern) { continue }
    # ... do other stuff
}

You could also use wildcard patterns and the -like operator, something like this:

$VMsToIgnore = @('*SQL01*', '*EXCH01*') 

foreach ($ds in $unprotectedDSList)
{
    if ($VMsToIgnore | Where-Object { $ds.Name -like $_ }) { continue }
    # ... do other stuff
}