How do I pass multiple wildcard strings to Where-Object? Script Help.

Hey all,

I found a script online that does almost exactly what I need it to and it does it quite fast as well. Essentially it pulls ALL the software installed on a machine(s) but I would like to find only instances of certain software titles. Here is the slightly modified version of the script:

<#
.SYNOPSIS
Get-InstalledSoftware retrieves a list of installed software
.DESCRIPTION
Get-InstalledSoftware opens up the specified (remote) registry and scours it for installed software. When found it returns a list of the software and it's version.
.PARAMETER ComputerName
The computer from which you want to get a list of installed software. Defaults to the local host.
.EXAMPLE
Get-InstalledSoftware DC1
This will return a list of software from DC1. Like:
Name Version Computer UninstallCommand
---- ------- -------- ----------------
7-Zip 9.20.00.0 DC1 MsiExec.exe /I{23170F69-40C1-2702-0920-000001000000}
Google Chrome 65.119.95 DC1 MsiExec.exe /X{6B50D4E7-A873-3102-A1F9-CD5B17976208}
Opera 12.16 DC1 "C:\Program Files (x86)\Opera\Opera.exe" /uninstall
.EXAMPLE
Import-Module ActiveDirectory
Get-ADComputer -filter 'name -like "DC*"' | Get-InstalledSoftware
This will get a list of installed software on every AD computer that matches the AD filter (So all computers with names starting with DC)
.INPUTS
[string[]]Computername
.OUTPUTS
PSObject with properties: Name,Version,Computer,UninstallCommand
.NOTES
Author: Anthony Howell
To add directories, add to the LMkeys (LocalMachine)
.LINK
[Microsoft.Win32.RegistryHive]
[Microsoft.Win32.RegistryKey]
#>
Function Get-InstalledSoftware {
Param(
[Alias('Computer', 'ComputerName', 'HostName')]
[Parameter(
ValueFromPipeline = $True,
ValueFromPipelineByPropertyName = $true,
Position = 1
)]
[string]$Name = $env:COMPUTERNAME
)
Begin {
$lmKeys = "Software\Microsoft\Windows\CurrentVersion\Uninstall", "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
$lmReg = [Microsoft.Win32.RegistryHive]::LocalMachine
$cuKeys = "Software\Microsoft\Windows\CurrentVersion\Uninstall"
$cuReg = [Microsoft.Win32.RegistryHive]::CurrentUser
}
Process {
if (!(Test-Connection -ComputerName $Name -count 1 -quiet)) {
Write-Error -Message "Unable to contact $Name. Please verify its network connectivity and try again." -Category ObjectNotFound -TargetObject $Computer
}
else {
$OS = (Get-CimInstance -ComputerName $Name -ClassName Win32_OperatingSystem).Caption
$masterKeys = @()
$remoteCURegKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($cuReg, $computer)
$remoteLMRegKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($lmReg, $computer)
foreach ($key in $lmKeys) {
$regKey = $remoteLMRegKey.OpenSubkey($key)
foreach ($subName in $regKey.GetSubkeyNames()) {
foreach ($sub in $regKey.OpenSubkey($subName)) {
$masterKeys += (New-Object PSObject -Property @{
"ComputerName" = $Name
"Name" = $sub.getvalue("displayname")
"SystemComponent" = $sub.getvalue("systemcomponent")
"ParentKeyName" = $sub.getvalue("parentkeyname")
"Version" = $sub.getvalue("DisplayVersion")
"UninstallCommand" = $sub.getvalue("UninstallString")
"InstallDate" = $sub.getvalue("InstallDate")
"RegPath" = $sub.ToString()
})
}
}
}
foreach ($key in $cuKeys) {
$regKey = $remoteCURegKey.OpenSubkey($key)
if ($regKey -ne $null) {
foreach ($subName in $regKey.getsubkeynames()) {
foreach ($sub in $regKey.opensubkey($subName)) {
$masterKeys += (New-Object PSObject -Property @{
"ComputerName" = $Name
"Name" = $sub.getvalue("displayname")
"SystemComponent" = $sub.getvalue("systemcomponent")
"ParentKeyName" = $sub.getvalue("parentkeyname")
"Version" = $sub.getvalue("DisplayVersion")
"OS" = $OS
"UninstallCommand" = $sub.getvalue("UninstallString")
"InstallDate" = $sub.getvalue("InstallDate")
"RegPath" = $sub.ToString()
})
}
}
}
}
}
$woFilter = { $null -ne $_.name -AND $_.SystemComponent -ne "1" -AND $null -eq $_.ParentKeyName }
$props = 'Name', 'Version', 'ComputerName', 'OS'
$masterKeys = ($masterKeys | Where-Object $woFilter | Select-Object $props | Sort-Object Name)
$masterKeys
}
End {}
}
Get-ADComputer -Filter { (Enabled -eq $true -and operatingSystem -like 'Windows*') } | Get-InstalledSoftware
What I'm trying to do is pipe this to Where-Object to filter for applications -Like '*Office Professional*' -or '*Visio Professional*' -or '*Roxio*'. I've tried using an array but found that -contains works like -match instead of -like. Any help is much appreciated.

Use regex OR:

$test = @"
Name
Microsft Office Non-Professional
Micosoft Office Professional 2020 X-Treme
Microsoft Visio Professional Platinum Plus
Roxio Creator NXT Z1000 Super Professional
Super Professional Plantinum Software Extra
"@ | ConvertFrom-CSV

$test | Where{ $_.Name -match 'Office Professional|Visio|Roxio' }

Output:


Name

Micosoft Office Professional 2020 X-Treme
Microsoft Visio Professional Platinum Plus
Roxio Creator NXT Z1000 Super Professional