Следующий скрипт используется для преобразования XML-файла в правильный формат. Есть 4 этапа:

  1. Удалить все заголовки XML
  2. Оберните все содержимое в testsuites элементов
  3. Добавить заголовок xml
  4. Удалить элементы timestamp из элементов testsuite

param (
[string] $inputPath = $(throw "-inputPath is required."),
[string] $outputPath = $(throw "-outputPath is required.")
)

$content = Get-Content $inputPath

$replaced = $content -replace '\<\?xml version="1\.0" encoding="UTF-8" \?>', ""

Write-Output $replaced

$xmlHeader = '<?xml version="1.0" encoding="UTF-8" ?>'

$xmlcontent = $xmlHeader + '<testsuites>' + $replaced + '</testsuites>'

$xml = New-Object -TypeName System.Xml.XmlDocument
$xml.LoadXml($xmlcontent)

$xml.testsuites.testsuite[0].RemoveAttribute('timestamp')
$xml.testsuites.testsuite[1].RemoveAttribute('timestamp')

$xml.Save($outputPath)

Моя проблема в этом. Относительный входной путь всегда работает. Относительный выходной путь всегда помещает файл в c:\windows\system32 . Я понимаю, что это связано с рабочим каталогом Powershell по умолчанию, но я изо всех сил пытаюсь объяснить поведение входного пути моим коллегам.

Я называю команду так:

xmlscript.ps1 -inputPath 'file.xml' -outputPath 'final.xml

2 ответа2

1

Я ожидал, что основной причиной проблемы будет то, как PS обрабатывает текущую концепцию папок, когда она работает со встроенными командлетами, такими как Get-Content и объектами как System.Xml

После некоторого поиска я нашел этот ответ на SO:

Set-Location (он же cd) в PowerShell не меняет текущий каталог, поддерживаемый ОС, поэтому текущий каталог обычно остается там, где он был при запуске PowerShell. Если вы хотите изменить текущий каталог, вы можете установить свойство [Environment]::CurrentDirectory

https://stackoverflow.com/questions/4822575/saving-an-xml-file-in-powershell-requires-complete-path-why

Проверьте это, это кажется законным для вашего случая.

0

Если все три файла находятся в одном и том же пути, вы можете вызвать скрипт таким образом

.\xmlscript.ps1 -inputPath '.\file.xml' -outputPath '.\final.xml

Или, если вы хотите сохранить файл final.xml по тому же пути, что и file.xml измените последнюю строку вашего скрипта на:

$savePath = Join-Path (Split-Path -Parent $inpuPath) (Split-Path -Leaf $outputPath)
$xml.Save($savePath)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .