从PowerShell格式化XML

时间:2016-09-01 09:16:43

标签: xml powershell

我有一个PowerShell脚本,它运行一个返回XML的存储过程。然后我将XML导出到一个文件中但是当我打开文件时,每行在末尾有3个点,并且该行不完整。这是使用out-file

当我使用Export-Clixml时,从查询返回的XML会被转储到名为<props>的标记中,该标记不是我的标记之一。

我不确定从何处开始将XML保存为原始格式。

我使用的PowerShell脚本与此类似:

$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 | out-file $File -Encoding utf8 

4 个答案:

答案 0 :(得分:7)

假设从SQL命令返回的XML是格式良好的XML,您还可以将XML字符串推送到.net的格式(基本上是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导出PowerShell XML,包括类型信息,可以从磁盘加载以补充变量 - 因此是额外的信息。

Out-File具有默认宽度,由主机PowerShell环境设置。请参阅Get-Help Out-File -Full

没有XML格式的示例,存储DataRow结果并选择XML列。

$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

您显然需要使用存储过程中列的名称重命名XMLColumn。

答案 1 :(得分:1)

您需要将数据转换为XML 试试这个:

[xml]$Result = Invoke-Sqlcmd -Query $Query -database MyDatabase -ServerInstance MyServer 
$Result | out-file $File -Encoding utf8 

或者

Invoke-Sqlcmd -Query $Query -database MyDatabase -ServerInstance MyServer |ConvertTo-XML |Out-File $File -Encoding utf8 

答案 2 :(得分:0)

function FormatXmlFile {
param (
    $filePath
)

$xml = Get-Content $filePath -Encoding Unicode
$xml = [xml]$xml
$Indent = 2
$StringWriter = New-Object System.IO.StringWriter
$XmlWriter = New-Object System.XMl.XmlTextWriter $StringWriter
$xmlWriter.Formatting = "indented"
$xmlWriter.Indentation = $Indent
$xml.WriteContentTo($XmlWriter)
$XmlWriter.Flush()
$StringWriter.Flush()
Set-Content -Path $filePath -Value $StringWriter.ToString()
}

答案 3 :(得分:-1)

function pxml ($xmlfile) {
  $a = [xml](get-content $xmlfile)
  $a.save("$xmlfile")
}