【问题标题】:How to get exitcode from XML file using PowerShell?如何使用 PowerShell 从 XML 文件中获取退出代码?
【发布时间】:2019-03-14 10:13:39
【问题描述】:

我有一个如下所示的 XML 文件:

<Feature>
    <B7>A</B7>
    <B8>B</B8>
    <B9>C</B9>
    <ExitCode>
        <Found>123</Found>
        <NotFound>789</NotFound>
    </ExitCode>
</Feature>

我的 PowerShell 脚本如下所示:

$regex = [regex]$Pattern
$matching = $regex.Match($FB)
if ($matching.Success) {
    while ($matching.Success) {
        "Match found: {0}" -f $matching.Value
        exit 123 #I want to delete this
        $matching = $matching.NextMatch()
    }
} else {
    "Not Found" 
    exit 789 #I want to delete this
}

我想得到exitcode,但是我不想写exit 123exit 780,我只是想从XML文件中调用exit code,所以每次我想改变exitcode号,我只是从 XML 文件修改,而不是从 PowerShell 脚本修改。

所以,如果我使用批处理文件运行脚本,我可以获得退出代码日志,如下所示:

set log=C:\Users\Log.txt
set PS=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
set PS=%PS%\powershell.exe -ExecutionPolicy Bypass -File 

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy Bypass -File C:\Users\XML.ps1 -i C:\Users\Feature.txt -j C:\Users\XML.xml

echo %ERRORLEVEL% > "%log%"

【问题讨论】:

标签: xml powershell batch-file exit-code


【解决方案1】:

类似这样的东西;读取 XML 文件,然后通过属性引用从中获取数字:

$xmlData = New-Object -TypeName System.Xml.XmlDocument
$xmlData.Load('c:\test\data.xml')

$regex = [regex]$Pattern
$matching = $regex.Match($FB)
if ($matching.Success) {
    while ($matching.Success) {
        "Match found: {0}" -f $matching.Value
        exit $xmlData.Feature.ExitCode.Found
        $matching = $matching.NextMatch()
    }
} else {
    "Not Found" 
    exit $xmlData.Feature.ExitCode.NotFound
}

编辑:更新以获得更好的 XML 处理,可以正确处理 XML 文件编码。感谢@tomalak 的 cmets。

【讨论】:

  • 不要通过将Get-Content 的结果转换为[xml] 来解析XML。这是根本错误的。 Get-Content 不知道 XML 文件的字节编码是什么,并且会愉快地默默地(!)破坏您的数据。始终使用 XML 解析器读取文件:$xml = New-Object xml; $xml.Load($path);,因为编码检测是 XML 解析器的基本功能。
  • @Tomalak 与任何其他文件读取有什么不同吗? Get-Content 会进行一些编码检测,只有在 PSv5.1 或更低版本读取没有 BOM 的 UTF8 文件的情况下,您才需要-Encoding UTF8,这是 PSv6+ 上的默认设置。 xml reading apparently defaults to UTF8 似乎对在 get-content 上保存一个参数很有用,但它本身“根本上”不足以说“永远不要使用方便的类型加速器”
  • @Tomalak 在 PSv5.1 及更低版本上 Get-Content 的默认值是 ASCII,在 PSv6 上是 UTF8NoBOM:docs.microsoft.com/en-us/powershell/module/…;您在哪里看到它使用“机器上的默认值”? (甚至什么是“机器的默认编码”?)。如果 XML 解析器可以在中途转换编码,那么这是首选 XML 解析器的一个很好的理由,但也是 XML 设计的噩梦般的恐惧。
  • @tomalak "文件编码检测是一个非常棘手的问题" - 这是一个愚蠢的问题。 “UTF8 有一个 BOM,但它是可选的并且不鼓励使用”——如果 BOM 是强制性的,那么自 1996 年以来的一切都将是微不足道的。 XML 有一个地方来声明所有文件都应该有的编码,这很整洁,但这不是一个已解决的问题。 “*我不相信你在读取文件时正确使用编码......所以我将通过移动问题来解决这个问题,而是相信你在创建文件时正确使用了编码”。哪一个,人们也不会这样做。但是,嗯。还有什么其他选择。
  • 请参加此讨论以聊天。答案的 cmets 几乎不是适合它的地方。
猜你喜欢
  • 2021-08-16
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多