Как загрузить определенные пакеты с сервера с помощью Powershell

#sql-server #powershell

#sql-сервер #powershell

Вопрос:

У меня есть сценарий PowerShell, который я пишу для извлечения всех заданий определенного сервера, например

 $sqlserver = "Servername"

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Smo') | Out-Null

$srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $sqlserver

$jobs = $srv.JobServer.Jobs

ForEach ($job in $jobs)
  {
   $jobname =$Servernaam.replace("","_")   '_'  $job.Name.replace(" ","_").replace("","_").replace("[","_").replace("]","_").replace(".","_").replace(":","_")   ".sql"
   $job.Script() | Out-File C:UsersDesktopJobs_from_ServerOrgineel$jobname
    if ($jobs -like '*.dtsx*')
  }
  

Код, который я получил, теперь получает все задания с сервера и сохраняет их в отдельных файлах.

Проблема в том, что я хочу получать задания только сервера Micrososft SQL, который содержит .dtsx в строке @command

Я попробовал, например

 ForEach ($job in $jobs)
  {
   $jobname =$Servernaam.replace("","_")   '_'  $job.Name.replace(" ","_").replace("","_").replace("[","_").replace("]","_").replace(".","_").replace(":","_")   ".sql"
   $job.Script() | Out-File C:UsersDesktopJobs_from_ServerOrgineel$jobname

    if ($jobs -like '*.dtsx*')
  

Я также попробовал - Contain и установил код в foreachloop следующим образом

 ForEach ($job in $jobs |if ($jobs -like '*.dtsx*'))
  

Ответ №1:

В вашем коде есть ряд опечаток и других ошибок, в которых объекты, которые вы используете, где. Попробуйте это для начала. Предполагается, что первым шагом в задании, использующем SSIS, является шаг SSIS. Измените по мере необходимости.

Ключевым моментом здесь является проверка subsystem шага (ов) задания, чтобы определить, выполняется ли этот шаг с подсистемой SSIS.

 $sqlserver = "servername"

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Smo') | Out-Null

$srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $sqlserver

$jobs = $srv.JobServer.Jobs

ForEach ($job in $jobs)
  {
    if ($Job.JobSteps[0].Subsystem -eq "ssis") {
        # Do SSIS stuff
        write-output "Found an SSIS job $($job.name)"
    }
  }
  

Комментарии:

1. Хороший код получает именно те задания, которые мне нужны. Вы также правы в отношении опечаток, поэтому я начал с нуля, используя ваш код в качестве основы