我目前正在构建一个流程,我们可以通过输入服务器名称将作业从一台服务器Powershell
复制到另一台服务器。SQL Server Agent
该脚本使用 SMO 库来获取对两个作业服务器的访问,编写“其他”服务器上不存在的作业,然后运行这些脚本(在 SqlConnection 和 SqlCommand 下)。问题是如何检查ServerOne
与ServerTwo
.
我尝试了四种不同的方法:使用来自 ServerTwo(比较服务器)的作业构建一个数组,并查看该数组是否是contains
来自 ServerOne 的作业;我还尝试了具有相同逻辑的 like 运算符;并且,使用数组,我在Compare-Object
从两个服务器加载具有作业名称的两个数组并测量另一个不存在哪些作业(也产生所有内容)之后使用。最后,我遍历了 ServerTwo 上的每个作业,并遍历了 ServerOne 上的每个作业,看看它们是否相等(这是下面的代码)。这将产生一切,因为每个工作不等于每个工作:
$ServerName = "S1\I"
$ComServer = "S2\I"
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ServerName
$com = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ComServer
foreach ($a in $com.JobServer.Jobs)
{
$a = $a.Name.ToString()
foreach ($j in $srv.JobServer.Jobs)
{
$j = $j.Name.ToString()
if ($a -like $j)
{
Write-Host $j
}
}
}
是否有另一种方法可以检查一个服务器上是否存在作业(作为说明,我已经知道如何编写作业脚本,执行它等等;确保作业不存在的部分已经存在是这里的问题)?
我从评论中看到您已经
Compare-Object
尝试过,但这确实应该有效。下面是一个显示这一点的工作示例:这将输出所有存在于
SQL1
和不存在于SQL2
. 此比较仅按名称进行,不考虑任何其他 SQL Server 代理作业属性。