2016-09-01 5 views
2

У меня есть сценарий PowerShell, который запускает хранимую процедуру, которая возвращает XML. Затем я экспортирую XML в файл, но когда я открываю файл, каждая строка имеет 3 точки в конце и строка не завершена. Это с использованием out-file.Форматирование XML из PowerShell

Когда я использую 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 

ответ

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 
+0

У Out-File есть ограничение по ширине. См. Мой ответ. – TechSpud

5

Предполагая, что XML, возвращенный из вашей команды SQL, является хорошо сформированным 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 с именем столбца из хранимой процедуры.

+0

Я получаю сообщение об ошибке с этим «Exception call« LoadXml »с аргументом« 1 »:« Данные на корневом уровне недействительны. Строка 1, позиция 1. « В строке: 6 символов: 3 + $ xmldoc.LoadXml ($ xmlcontent) + ~~~~~~~~~~~~~ ~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: DotNetMethodException " – Cornflake2068

+0

Похоже, что ваш XML недостаточно хорошо сформирован (может быть, несколько корневых узлов?). Используйте этот пример без функции и удалите строку | Format-XML ' TechSpud

+0

он возвращает каждую строку, но вместо XML он говорит «System.Data.DataRow» – Cornflake2068

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