首页 > 解决方案 > 如何在数组上使用带有 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 的通配符?

标签: powershell

解决方案


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

推荐阅读