• Some similar powershell scripts I cobbled together.

    Script jobs and some other server objects I'm interested in:

    Note that there should be as many "paths" as there are "output paths" if you add types to this.

    $Scripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter") ("(local)")

    $Paths = "SQLSERVER:\SQL\localhost\DEFAULT\JobServer\Jobs","SQLSERVER:\SQL\localhost\DEFAULT\Logins","SQLSERVER:\SQL\localhost\DEFAULT\LinkedServers","SQLSERVER:\SQL\localhost\DEFAULT\Mail\Accounts","SQLSERVER:\SQL\localhost\DEFAULT\Mail\Profiles","SQLSERVER:\SQL\localhost\DEFAULT\JobServer\Operators"

    $OutputPaths = "Server\Jobs","Server\Logins","Server\LinkedServers","Server\Mail\Accounts","Server\Mail\Profiles","Server\Operators"

    $i = 0

    do

    {

    $path = $Paths[$i]

    $Outputpath = "Source\SQL\"+$OutputPaths[$i]

    new-item -Force -path D:\ -name $Outputpath -type directory

    $dirname = "D:\" + $Outputpath

    cd $path

    foreach ($item in Get-Childitem)

    {

    if ($item.Name.Substring(0,2) -eq "##")

    {

    echo $item.Name

    continue

    }

    $Scripter.Options.AnsiPadding=$False

    $Scripter.Options.AnsiFile=$True

    $Scripter.Options.AppendToFile=$False

    $Scripter.Options.Bindings=$False

    $Scripter.Options.DriAll=$True

    $Scripter.Options.ExtendedProperties=$False

    $Scripter.Options.IncludeHeaders=$False

    $Scripter.Options.IncludeIfNotExists=$False

    $Scripter.Options.IncludeDatabaseRoleMemberships=$True

    $Scripter.Options.IncludeDatabaseContext=$True

    $Scripter.Options.Permissions=$True

    $Scripter.Options.SchemaQualify=$True

    $Scripter.Options.ScriptData=$False

    $Scripter.Options.ScriptDrops=$False

    $Scripter.Options.Statistics=$False

    $Scripter.Options.ToFileOnly=$True

    $p = "D:\"+$Outputpath+"\"+$item.Name.Replace("\","_").Replace(" ","_")+".sql"

    $Scripter.Options.FileName=$p

    $Scripter.Script($Item)

    }

    $i++

    }

    while ($i -lt $Paths.Length)

    Script database objects I'm interested in (including certain specific table bits like indexes and foreign keys)

    Param

    (

    $Database

    )

    $Scripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter") ("(local)")

    $TableSubtypes = "Indexes","Triggers","ForeignKeys"

    $ExcludedScriptTypes = "ApplicationRoles","AsymmetricKeys","Certificates","DatabaseAuditSpecifications","Defaults","ExtendedProperties","ExtendedStoredProcedures","FileGroups","LogFiles","SymmetricKeys","ServiceBroker"

    $Path = "SQLSERVER:\SQL\localhost\DEFAULT\Databases\"+$Database

    cd $Path

    foreach ($objectType in Get-ChildItem)

    {

    if ($ExcludedScriptTypes -contains $objectType)

    {

    continue

    }

    $Path = "SQLSERVER:\SQL\localhost\DEFAULT\Databases\"+$Database+"\"+$objectType

    cd $Path

    $dirname = "Source\SQL\Databases\" + $Database + "\" + $objectType

    new-item -Force -path D:\ -name $dirname -type directory

    foreach ($Item in Get-ChildItem)

    {

    $Scripter.Options.AnsiPadding=$False

    $Scripter.Options.AnsiFile=$True

    $Scripter.Options.AppendToFile=$False

    $Scripter.Options.Bindings=$False

    $Scripter.Options.DriAll=$True

    $Scripter.Options.ExtendedProperties=$False

    $Scripter.Options.IncludeHeaders=$False

    $Scripter.Options.IncludeIfNotExists=$False

    $Scripter.Options.IncludeDatabaseRoleMemberships=$True

    $Scripter.Options.IncludeDatabaseContext=$False

    $Scripter.Options.Permissions=$True

    $Scripter.Options.SchemaQualify=$True

    $Scripter.Options.ScriptData=$False

    $Scripter.Options.ScriptDrops=$False

    $Scripter.Options.Statistics=$False

    $Scripter.Options.ToFileOnly=$True

    $modifier = ""

    if ($Item.Schema -ne $null)

    {

    $modifier += $Item.Schema + "."

    }

    if ($Item.Name -ne $null)

    {

    $p = $Item.Name

    $modifier += $Item.Name.Replace("\","_") + "."

    }

    $Scripter.Options.FileName="D:\Source\SQL\Databases\"+$Database+"\"+$objectType+"\" + $modifier + "sql"

    $p = "D:\Source\SQL\Databases\"+$database+"\"+$objectType+"\" + $modifier + "sql"

    echo $p

    $Scripter.Script($Item)

    if ($objectType -eq "Tables")

    {

    foreach ($subtype in $TableSubtypes)

    {

    foreach ($subitem in $Item.$subtype)

    {

    $Scripter.Options.AnsiPadding=$False

    $Scripter.Options.AnsiFile=$True

    $Scripter.Options.AppendToFile=$False

    $Scripter.Options.Bindings=$False

    $Scripter.Options.DriAll=$False

    $Scripter.Options.ExtendedProperties=$False

    $Scripter.Options.IncludeHeaders=$False

    $Scripter.Options.IncludeIfNotExists=$False

    $Scripter.Options.Permissions=$True

    $Scripter.Options.SchemaQualify=$True

    $Scripter.Options.ScriptData=$False

    $Scripter.Options.ScriptDrops=$False

    $Scripter.Options.Statistics=$False

    $Scripter.Options.ToFileOnly=$True

    $modifier = ""

    if ($Item.Schema -ne $null)

    {

    $modifier += $Item.Schema + "."

    }

    if ($Item.Name -ne $null)

    {

    $modifier += $Item.Name.Replace("\","_") + "."

    }

    if ($subitem.Name -ne $null)

    {

    $modifier += $subitem.Name.Replace("\","_") + "."

    }

    if ($subtype -eq "Indexes")

    {

    if ($subitem.IsClustered)

    {

    $modifier += "Clustered."

    }

    if ($subitem.IndexKeyType -eq "DriPrimaryKey")

    {

    #Primary keys fall under indexes as well as primary key branches

    $subtype = "PrimaryKeys"

    } else

    {

    $subtype = "Indexes"

    }

    }

    $dirname = "Source\SQL\Databases\" + $Database + "\" + $subtype

    new-item -Force -path D:\ -name $dirname -type directory

    $Scripter.Options.FileName="D:\Source\SQL\Databases\"+$database+"\"+$subtype+"\" + $modifier + "sql"

    $p = "D:\Source\SQL\Databases\"+$database+"\"+$subtype+"\" + $modifier + "sql"

    echo $p

    $Scripter.Script($subitem)

    }

    }

    }

    }

    }

    A sort of wrapper script to iterate through all the databases I want to script like this (e.g. nightly from a job), assuming of course you called the script above "ScriptDatabase.ps1" and stored in path shown :). This could be rolled into the above script, but wanted to retain ability to take a snapshot of a single database scripts.

    $Path = "SQLSERVER:\SQL\localhost\DEFAULT\Databases"

    cd $Path

    foreach ($item in Get-Childitem)

    {

    echo $item.Name

    D:\Scripts\ScriptDatabase.ps1 $item.Name

    }

    All of these scripts write to specific folders on the D:\ of my servers but could be adapted.

    Lookup $Scripter.Options on the net for parameters to pretty much mirror anything you can do via "Generate scripts" in SSMS

    Obviously a disclaimer applies: This does not cover every aspect of every type of object in SQL Server and should not be relied on in lieu of a proper backup. Adjust this to ensure that permissions / extended properties / other object types that this script excludes are included appropriately.

    Regards,

    Mike