2011-07-12 49 views
0

我是新來的powershell,我試圖編寫出所有SQL代理作業。我發現了一些代碼,這要歸功於SOLID QUALITY MENTORS的ENRIQUE。所有SQL代理作業上的腳本丟失

我的問題是,我如何編寫腳本,如果存在,爲每項工作放下? Options.ScriptJobs似乎沒有做我認爲應該做的事情?

參數([字符串] $服務器名稱,[字符串] $ 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

您可以排除與單詞「drop table」不匹配的腳本。例如:

$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創建DROP命令,因爲它是依賴於工作的ID,這使生成的腳本不可重複使用。