我编写了以下脚本来比较我保存在文件夹中的作业,并在服务器上按名称进行比较。
$submaporiginal = 'D:\Jobs_from_Server\TEST_Jobs_Aangepast'
$SqlServer1Name = "servername"
$SqlServer1 = New-Object Microsoft.SqlServer.Management.Smo.Server($SqlServer1Name)
$files = Get-ChildItem $submaporiginal *.sql
$SqlServer1JobListing = $SqlServer1.JobServer.Jobs |
Select-Object -ExpandProperty Name
foreach ($file in $files)
{
$stap1 = $file.Name
$locatiedtsx = $stap1.IndexOf("_goed")
$SqlServer2JobListing = $stap1.Substring(0,$locatiedtsx)
}
Compare-Object $SqlServer1JobListing $SqlServer2JobListing
{
if ($_.SideIndicator -eq "<=")
{Write-Host $_}
}
运行后,它会显示一个列表,其中包含当前服务器上但尚未保存在文件夹中的所有作业:TEST_Jobs_Aangepast
我的问题是,目前它只会忽略已通过foreach ($file in $files)
对于地图中的例子,文件是TestA.sql和TestB.SQL,而服务器有一个名为testA,TestB和TestC的作业。 显示的结果应该是:
但实际结果显示:
我的问题是如何在一个参数foreach ($file in $files)
中设置SqlServer2JobListing
的所有值,以便不显示$SqlServer1JobListing $SqlServer2JobListing
之间匹配的所有作业
答案 0 :(得分:2)
您的问题是您始终重新分配$SqlServer2JobListing
变量,而是需要向数组或列表添加值。像这样:
$SqlServer1JobListing = New-Object System.Collections.ArrayList
foreach ($file in $files)
{
$stap1 = $file.Name
$locatiedtsx = $stap1.IndexOf("_goed")
$SqlServer1JobListing.Add($stap1.Substring(0,$locatiedtsx))
}
这样,在foreach
循环后,您将获得所有项目的集合,而不是像之前一样的最后一项。