我有一个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
答案 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")
}