Assuming the XML returned from your SQL command is well formed XML, you could also push the XML string through .net's formatting (essentially a pretty printing of the XML).
function Format-XML {
[CmdletBinding()]
Param ([Parameter(ValueFromPipeline=$true,Mandatory=$true)][string]$xmlcontent)
$xmldoc = New-Object -TypeName System.Xml.XmlDocument
$xmldoc.LoadXml($xmlcontent)
$sw = New-Object System.IO.StringWriter
$writer = New-Object System.Xml.XmlTextwriter($sw)
$writer.Formatting = [System.XML.Formatting]::Indented
$xmldoc.WriteContentTo($writer)
$sw.ToString()
}
$Date = Get-Date -format "yyyyMMdd_HHmm"
$File = "C:\Temp\MyFile"+$Date+".xml"
$Query = "exec dbo.usp_MyProc"
Invoke-Sqlcmd -Query $Query -database MyDatabase -ServerInstance MyServer `
| Format-XML `
| Set-Content -Path $File -Force
Export-CliXml
exports PowerShell XML, including type information, that can be loaded from disk to rehydrate a variable - hence the extra information.
Out-File
has a default width, set by the host PowerShell environment. See Get-Help Out-File -Full
.
An example without the XML formatting, storing the DataRow result and picking out the XML column.
$Date = Get-Date -format "yyyyMMdd_HHmm"
$File = "C:\Temp\MyFile"+$Date+".xml"
$Query = "exec dbo.usp_MyProc"
$resultRow = Invoke-Sqlcmd -Query $Query -database MyDatabase -ServerInstance MyServer
$resultRow['XMLColumn'] | Set-Content -Path $File -Force
You'll obviously need to rename XMLColumn with the name of the column from your stored procedure.
| Format-XML `
– TechSpud Sep 01 '16 at 14:33