以下脚本用于将 xml 文件转换为正确的格式。共有 4 个阶段:
- 删除所有 xml 标头
- 将所有内容包裹在
testsuites
元素中 - 添加 xml 标头
- 从元素中删除
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
答案1
我预计问题的根本原因是 PS 在使用内置命令(如Get-Content
和对象)时处理当前文件夹概念的方式System.Xml
经过一番搜索,我找到了这个答案:
PowerShell 中的 Set-Location(又名 cd)不会更改操作系统维护的当前目录,因此当前目录通常保留启动 PowerShell 时的位置。如果要更改当前目录,可以设置 [Environment]::CurrentDirectory 属性
检查一下,它似乎适合你的情况。
答案2
如果所有三个文件都位于同一路径,则可以通过以下方式调用脚本
.\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)