2011-07-12 23 views
0

私はpowershellを初めて使用しており、すべてのSQLエージェントジョブをスクリプト化しようとしています。私は、SOLID QUALITY MENTORSのENRIQUEのおかげでそのようなコードを見つけました。すべてのSQLエージェントジョブでスクリプトが削除される

私の質問は、どのようにスクリプトを作成すればよいのですか?すべてのジョブを削除しますか? Options.ScriptJobsは私がそれをするべきだとは思わないでしょうか?

PARAM([文字列] $サーバー名、[文字列] $ jobNameFile)

関数スクリプトSQLJobs([文字列] $サーバ、[文字列] $ jobNameFile) { [reflection.assembly] :: LoadWithPartialName ( "Microsoft.SqlServer.Smo")|アウトヌル

$srv = New-Object Microsoft.SqlServer.Management.Smo.Server("$server") 
$db = New-Object Microsoft.SqlServer.Management.Smo.Database 
$scrp = New-Object Microsoft.SqlServer.Management.Smo.Scripter($srv) 
$scrp.Options.ScriptDrops = $TRUE 
$scrp.Options.WithDependencies = $TRUE 


$jobNameFile = "C:\SQLJOBS\Jobs.sql" 
remove-item $jobNameFile 

$jobs = $srv.JobServer.get_Jobs() 
$jobs=$jobs | Where-Object {$_.Name -notlike "sys*"}  

foreach($job in $jobs) 
{ 
    $script=$job.Script() 
    $script >> $jobNameFile 
    "GO" >> $jobNameFile 

} 

}

スクリプト-SQLJobs $ serverNameの$ jobNameFile

感謝します。

答えて

0

単語「ドロップテーブル」と一致しないスクリプトを除外できます。たとえば:

$srv.JobServer.Jobs | Where-Object {$_.Name -notlike "sys*"} | Foreach-Object{ 
     $script = $_.Script() 

     if($script -notmatch 'DROP TABLE') 
     { 
      $script+ "`nGO`n" 
     } 

} | Out-File $jobNameFile 

別(化粧品)オプションは、すべてのジョブステップコマンドを確認するには、次のようになります。あなたはあなたのスクリプトのオプションを提供する必要が

$srv.JobServer.Jobs | Where-Object {$_.Name -notlike "sys*"} | Foreach-Object{ 

    $cmd = $_.JobSteps | select -expand Command 

     if($cmd -match 'DROP TABLE') 
     { 
      $_.script()+ "`nGO`n" 
     }  
} | Out-File $jobNameFile 
0

は、スクリプトメソッドにオブジェクト:

$script=$job.Script($scrp) 
0

ここでは、あなたが望むように拡張されたhttp://www.johnsansom.com/script-sql-server-agent-jobs-using-powershell/からコピーされたPowershellスクリプトです。

# Date:  16/02/14 
# Author: John Sansom 
# Description: PS script to generate all SQL Server Agent jobs on the given instance. 
#  The script accepts an input file of server names. 
# Version: 1.1 
# 
# Example Execution: .\Create_SQLAgentJobSripts.ps1 .\ServerNameList.txt 

param([String]$ServerListPath) 

#Load the input file into an Object array 
$ServerNameList = get-content -path "Servers.txt" 
#$ServerNameList = get-content -path $ServerListPath 

#Load the SQL Server SMO Assemly 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null 

#Create a new SqlConnection object 
$objSQLConnection = New-Object System.Data.SqlClient.SqlConnection 

#For each server in the array do the following.. 
foreach($ServerName in $ServerNameList) 
{ 
    Try 
    { 
    $objSQLConnection.ConnectionString = "Server=$ServerName;Integrated Security=SSPI;" 
     Write-Host "Trying to connect to SQL Server instance on $ServerName..." -NoNewline 
     $objSQLConnection.Open() | Out-Null 
     Write-Host "Success." 
    $objSQLConnection.Close() 
    } 
    Catch 
    { 
    Write-Host -BackgroundColor Red -ForegroundColor White "Fail" 
    $errText = $Error[0].ToString() 
     if ($errText.Contains("network-related")) 
    {Write-Host "Connection Error. Check server name, port, firewall."} 

    Write-Host $errText 
    continue 
    } 

    #IF the output folder does not exist then create it 
    $OutputFolder = ".\$ServerName" 
    $DoesFolderExist = Test-Path $OutputFolder 
    $null = if (!$DoesFolderExist){MKDIR "$OutputFolder"} 

    #Create a new SMO instance for this $ServerName 
    $srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ServerName 

    #Script out each SQL Server Agent Job for the server 
    foreach($job in $srv.JobServer.Jobs) 
    { 
    Write-Host $job.Name 

    $script = "" 
    $script = $script + "-- Uninstall the job" + "`r`n" 
    $script = $script + "DECLARE @jobId binary(16)" + "`r`n" 
    $script = $script + "SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'$job')" + "`r`n" 
    $script = $script + "IF (@jobId IS NOT NULL)" + "`r`n" 
    $script = $script + "BEGIN" + "`r`n" 
    $script = $script + " EXEC msdb.dbo.sp_delete_job @[email protected], @delete_unused_schedule=1" + "`r`n" 
    $script = $script + "END" + "`r`n" 
    $script = $script + "GO`r`n" 
    $script = $script + "`r`n" 
    $script = $script + "-- Install the job" + "`r`n" 
    $script = $script + $job.Script() 
    $script = $script + "GO`r`n" 

    $fileName = $job.Name -replace '\\', '' 

    $script | out-file ".\$OutputFolder\$fileName.sql" 
    } 
} 

注:実際にSMOを使用したくない、それは結果のスクリプト非再利用可能になるのジョブID、に依存しているため、DROPコマンドを作成しました。

関連する問題