这样的事情应该这样做:
$xmlFile = "D:\Test\YourXmlFile.xml" # put your file here
$xml = New-Object System.XML.XMLDocument
$xml.Load($xmlFile)
$pwChars = "!@#$%^&*0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".ToCharArray()
$password = ($pwChars | Sort-Object {Get-Random})[0..16] -join ''
# set the password on the Password element inside the OPs element where it matches the Resource attribute
($xml.BAPI.OPs | Where-Object {$_.Resource -eq "https://XYZSevr:11231/api/Ops"}).Password = $password
# save the updated xml
$xml.Save($xmlFile)
简要介绍一下 XML 特殊字符,在本例中为&
在 XML 中,元素值中不允许有五个特殊字符。它们是<
, &
, >
, 双引号"
和单引号'
。
上面保存包含此类字符的密码的代码会自动将这些字符“识别”为相应的字符。<
, &
,和. >
_ 在某些情况下,使用数字实体代替(如become )。"
'
&
&
当您在文本编辑器中打开 XML 时,您可能会认为这些实体破坏了密码,并且如果下一个脚本或应用程序尝试使用正则表达式等文本方式解析 XML,那么它确实可以返回保存的密码,包括&
.
但是,如果使用 XML 的脚本在此方面遵循 XML 规则,则无需担心,因为实体也会自动转换回它们所代表的字符。
假设您保存的 XML 如下所示
<?xml version="1.0" encoding="UTF-8"?>
<BAPI xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BAPI.xsd">
<OPs Resource="https://XYZSevr:11231/api/Ops">
<Password>MP_jFmu0&sXBgEWcw</Password>
</OPs>
</BAPI>
如您所见,该&
字符在那里写为&
使用 Powershell,只需像这样读取保存的密码:
$xmlFile = "D:\Test\YourXmlFile.xml" # put your file here
$xml = New-Object System.XML.XMLDocument
$xml.Load($xmlFile)
$password = ($xml.BAPI.OPs | Where-Object {$_.Resource -eq "https://XYZSevr:11231/api/Ops"}).Password
$password
中的结果值$password
被“取消识别”到MP_jFmu0&sXBgEWcw
中,就像您想要的那样。