powershell - 如何在数组上使用带有 IF -contains 的通配符?
问题描述
我正在编写一个将数据库架构备份到版本控制系统的脚本。我刚刚意识到复制的对象也被脚本化了;这些对象以 sp_MSupd_、sp_MSdel_、sp_MSins_ 和 syncobj_0x 开头。我想跳过这些项目。
我知道我可以做这样的事情:
$ExcludeObjectNames = @("sp_MSupd_", "sp_MSdel_","sp_MSins_","syncobj_0x")
If ($ExcludeObjectNames -contains "sp_MSdel_SampleObject")
{
Write-Host "replicated item found"
}
但这仅适用于完全匹配。我尝试将 * 添加到数组中的元素,但没有奏效。而且我知道我可以使用 -like,但这似乎只适用于单个值,而不是数组。
我知道我能做到
$ObjectNames = "sp_MSdel_SampleObject"
If ($ObjectNames -like "sp_MSupd_*" -OR $ObjectNames -like "sp_MSdel_*" -OR $ObjectNames -like "sp_MSins_*" -OR $ObjectNames -like "syncobj_0x*")
{
Write-Host "replicated item found"
}
这很好,但是如果我发现越来越多的东西要省略,这会变得越来越难看。
有没有办法在数组上使用带有 -contains 的通配符?
解决方案
$ExcludeObjectNames = @("sp_MSupd_", "sp_MSdel_","sp_MSins_","syncobj_0x")
Foreach ($ExcludeObjectName in $ExcludeObjectNames) {
If ("sp_MSdel_SampleObject" -match $ExcludeObjectName)
{
Write-Host "replicated item found"
}
}
或者,如果您只想编辑脚本中的变量,您可以执行以下操作:
$ExcludeObjectNames = @("sp_MSupd_", "sp_MSdel_","sp_MSins_","syncobj_0x")
$ObjectToCheck = "sp_MSdel_SampleObject" # This variable contains your original contains target
Foreach ($ExcludeObjectName in $ExcludeObjectNames) {
If ($ObjectToCheck -match $ExcludeObjectName)
{
Write-Host "replicated item found"
}
}
如果您不喜欢循环,您可以从原始数组构建一个正则表达式过滤器:
$ExcludeObjectNames = @("sp_MSupd_", "sp_MSdel_","sp_MSins_","syncobj_0x")
$ObjectToCheck = "sp_MSdel_SampleObject" # This variable contains your original contains target
$excludeFilter = '(^' + ($excludeobjectnames -join "|^") + ')' # Regex filter that you never have to manually update
If ($ObjectToCheck -match $ExcludeFilter)
{
Write-Host "replicated item found"
}