functions/New-ADSWorkBook.ps1
<#
.SYNOPSIS Creates a New Azure Data Studio WorkBook .DESCRIPTION This will create a new Azure Data Studio Notebook .PARAMETER Path The full path where you want the notebook saved - must end with .ipynb .PARAMETER cells An array of New-AdsWorkBookCells to add to the WorkBook .PARAMETER Type The type of WorkBook to create - SQL or PowerShell or DotNetPowerShell .EXAMPLE $introCelltext = "# Welcome to my Auto Generated SQL Notebook ## Automation Using this we can automate the creation of notebooks for our use " $SecondCelltext = "## Running code The next cell will have some code in it for running ## Server Principals Below is the code to run against your instance to find the server principals that are enabled" $thirdcelltext = "SELECT Name FROM sys.server_principals WHERE is_disabled = 0" $Intro = New-ADSWorkBookCell -Type Text -Text $introCelltext $second = New-ADSWorkBookCell -Type Text -Text $SecondCelltext $third = New-ADSWorkBookCell -Type Code -Text $thirdcelltext $path = 'C:\temp\AutoGenerated.ipynb' New-ADSWorkBook -Path $path -cells $Intro,$second,$third -Type SQL Creates 3 cells with New-AdsWorkBookCells to add to the workbook, two text ones and a code one, then creates a SQL Notebook with those cells and saves it as C:\temp\AutoGenerated.ipynb .EXAMPLE $introCelltext = "# Welcome to my Auto Generated PowerShell Notebook ## dbatools ![image](https://user-images.githubusercontent.com/6729780/68845538-7afcd200-06c3-11ea-952e-e4fe72a68fc8.png) dbatools is an open-source PowerShell Module for administering SQL Servers. You can read more about dbatools and find the documentation at [dbatools.io](dbatools.io) " $SecondCelltext = "### Installation You can install dbatools from the PowerShell Gallery using `Install-Module dbatools` " $thirdcelltext = "Install-Module dbatools" $fourthCelltext = "### Getting Help You should always use `Get-Help` to fins out how to use dbatools (and any PowerShell) commands" $fifthcelltext = "Get-Help Get-DbaDatabase" $sixthCelltext = "Try a command now. get the name, owner and collation of the user databases on the local instance" $seventhCellText = "Get-DbaDatabase -SqlInstance localhost -ExcludeSystem | Select Name, Owner, Collation" $Intro = New-ADSWorkBookCell -Type Text -Text $introCelltext $second = New-ADSWorkBookCell -Type Text -Text $SecondCelltext $third = New-ADSWorkBookCell -Type Code -Text $thirdcelltext $fourth = New-ADSWorkBookCell -Type Text -Text $fourthCelltext $fifth = New-ADSWorkBookCell -Type Code -Text $fifthcelltext $sixth = New-ADSWorkBookCell -Type Text -Text $sixthCelltext $seventh = New-ADSWorkBookCell -Type Code -Text $seventhCellText $path = 'C:\temp\dbatools.ipynb' New-ADSWorkBook -Path $path -cells $Intro,$second,$third,$fourth,$fifth,$sixth,$Seventh -Type PowerShell Creates 7 cells with New-AdsWorkBookCells to add to the workbook, four text ones and three code ones, then creates a PowerShell Notebook with those cells and saves it as C:\temp\dbatools.ipynb .NOTES Rob Sewell 10/10/2019 - Initial Rob Sewell 14/11/2019 - Added PowerShell Notebooks type Rob Sewell 23/07/2020 - Added DotNetPowerShell Notebook Rob Sewell @SQLDbaWithBeard blog.robsewell.com #> function New-ADSWorkBook { [cmdletbinding(SupportsShouldProcess)] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidTrailingWhitespace", "", Justification = "the markdown requires a trailing space to work correctly")] Param( # The full path to the file [Parameter(Mandatory)] [ValidateScript({ if($_ -match '^*.ipynb'){ $true } else{ Throw [System.Management.Automation.ValidationMetadataException] "The path $($_) does not have the correct extension. It needs to be .ipynb" } })] [string] $Path, # The cells (in order) created by New-ADSWorkBookCell to build the notebook [Parameter(Mandatory)] [pscustomobject[]] $cells, # The type of notebook [Parameter(Mandatory)] [ValidateSet('SQL','PowerShell','DotNetPowerShell')] [string] $Type ) $PSCmdlet.WriteVerbose('Lets create a Notebook of type $type') $PSCmdlet.WriteVerbose('Creating the base object') switch ($type) { 'DotNetPowerShell' { $Base = [PSCustomObject]@{ metadata = [PSCustomObject]@{ kernelspec = [PSCustomObject]@{ name = '.net-powershell' language = "PowerShell" display_name = '.NET (PowerShell)' } } language_info = [PSCustomObject]@{ name = 'PowerShell' version = '7.0' pygments_lexer = 'powershell' mimetype = 'text/x-powershell' file_extension = '.ps1' } nbformat_minor = 4 nbformat = 4 cells = @() } } 'PowerShell' { $Base = [PSCustomObject]@{ metadata = [PSCustomObject]@{ kernelspec = [PSCustomObject]@{ name = 'powershell' display_name = 'PowerShell' } } language_info = [PSCustomObject]@{ name = 'powershell' version = '' codemirror_mode = 'shell' mimetype = 'text/x-sh' file_extension = '.ps1' } nbformat_minor = 2 nbformat = 4 cells = @() } } 'SQL' { $Base = [PSCustomObject]@{ metadata = [PSCustomObject]@{ kernelspec = [PSCustomObject]@{ name = 'SQL' display_name = 'SQL' language = 'sql' } } language_info = [PSCustomObject]@{ name = 'sql' version = '' } nbformat_minor = 2 nbformat = 4 cells = @() } } } $PSCmdlet.WriteVerbose('Adding the array of cells to the base object') foreach ($cell in $cells) { $base.cells += $cell } $PSCmdlet.WriteVerbose('Finished adding the array of cells to the base object') $PSCmdlet.WriteVerbose('Creating the json and replacing the back slashes and double quotes') try { if($IsCoreCLR){ $base = ($Base | ConvertTo-Json -Depth 4 ).Replace('\\r ', '\r').Replace('\\n ', '\n').Replace('"\', '').Replace('\""','"') } else{ # Grr PowwerShell $base = ($Base | ConvertTo-Json -Depth 4 ).Replace('\\r ', '\r').Replace('\\n ', '\n').Replace('\"\u003e','\">').Replace('"\"\u003c','"<').Replace('"\"', '"').Replace('\""','"').Replace('\u003c','<').Replace('\u003e','>') } } catch { $PSCmdlet.WriteWarning('Failed to create the json for some reason. Run `$error[0] | fl -force to find out why') Return } $PSCmdlet.WriteVerbose('json created') if ($PSCmdlet.ShouldProcess("$path", "Creating File")) { $Base | Set-Content -Path $path } $PSCmdlet.WriteVerbose('Created json file at' + $path + ' - Go and open it in Azure Data Studio') } |