将变量复制到 xml 文件的脚本
Script to copy variable into xml file
我有一些软件可以解析 .xml 文件以获取登录信息(用户名和密码)。过去,我们一直为该软件的数百名用户使用相同的用户名和密码,这已成为一个安全问题。我可以轻松地用新的登录信息替换这个 .xml 文件,但我需要一些帮助来为数百个用户设置用户名。
到目前为止,我已经为需要复制到的每台计算机生成了一个 XML 文件。
例如:
Computer1.xml
Computer2.xml
Computer3.xml
...
Computer290.xml
XML 文件本身是这样的:
<?xml version="1.0" encoding="utf-8"?>
<settings>
<server default="true">
<connection ssl="false">
<address>fax.servername.com</address>
<login>USERNAME</login>
<password>PASSWORD</password>
</connection>
<about>
<model>MODELNUMBER</model>
<version>VERSIONNUMBER</version>
</about>
<user>
<contact_url>http://contacturl/users/username</contact_url>
<username>USERNAME</username>
<name>JOHN DOE</name>
<organization>Company Name</organization>
<default_cover_page_enabled>false</default_cover_page_enabled>
<default_cover_page_name></default_cover_page_name>
<priority>3</priority>
<max_attempts>3</max_attempts>
<interval>300</interval>
<receipt>failure</receipt>
<receipt_attachment>pdf</receipt_attachment>
</user>
</server>
</settings>
我知道以纯文本形式存储密码是个糟糕的主意,但遗憾的是该软件太旧,不支持其他方法。
我有一个包含用户名和他们使用的计算机的 csv 文件。
例如
(编辑:更改为 CSV 文件格式)
User1,Computer1
User2,Computer2
User3,Computer3
如何获取这些用户名并将其弹出到 xml 文件中,以便它们与正确的计算机名称相对应?
让我们考虑这个用户-computer.csv:
UserName,ComputerName
User1,Computer1
User2,Computer2
User3,Computer3
那么您可以尝试以下操作(使用正确的正确路径进行修改,在此演示中使用当前目录):
Import-Csv -Path .\user-computer.csv | ForEach-Object {
#$_ is the current object
#Your "xml" is not a valid xml file as it doesn't have a root element, so we should use text replacement to modify the files.
(Get-Content -Path ".$($_.ComputerName).xml") -replace '(?<=<username>)(.*?)(?=<\/username>)', $_.UserName | Set-Content -Path ".$($_.ComputerName).xml"
}
如果您只想根据 CSV 中的列表验证 computer/user 配对,我将从 CSV 中创建哈希表:
$csv = @{}
Import-Csv 'C:\path\to\your.csv' | % {
$csv[$_.ComputerName] = $_.UserName.Trim()
}
然后像这样进行验证:
Get-ChildItem 'C:\path\to\*.xml' | % {
[xml]$xml = Get-Content $_.FullName
$username = $xml.SelectSingleNode('//username').'#text'.Trim()
if ($username -ne $csv[$_.BaseName]) {
"[{0}] User mismatch: {1}, {2}" -f $_.BaseName, $username, $csv[$_.BaseName]
}
}
我有一些软件可以解析 .xml 文件以获取登录信息(用户名和密码)。过去,我们一直为该软件的数百名用户使用相同的用户名和密码,这已成为一个安全问题。我可以轻松地用新的登录信息替换这个 .xml 文件,但我需要一些帮助来为数百个用户设置用户名。
到目前为止,我已经为需要复制到的每台计算机生成了一个 XML 文件。
例如:
Computer1.xml
Computer2.xml
Computer3.xml
...
Computer290.xml
XML 文件本身是这样的:
<?xml version="1.0" encoding="utf-8"?>
<settings>
<server default="true">
<connection ssl="false">
<address>fax.servername.com</address>
<login>USERNAME</login>
<password>PASSWORD</password>
</connection>
<about>
<model>MODELNUMBER</model>
<version>VERSIONNUMBER</version>
</about>
<user>
<contact_url>http://contacturl/users/username</contact_url>
<username>USERNAME</username>
<name>JOHN DOE</name>
<organization>Company Name</organization>
<default_cover_page_enabled>false</default_cover_page_enabled>
<default_cover_page_name></default_cover_page_name>
<priority>3</priority>
<max_attempts>3</max_attempts>
<interval>300</interval>
<receipt>failure</receipt>
<receipt_attachment>pdf</receipt_attachment>
</user>
</server>
</settings>
我知道以纯文本形式存储密码是个糟糕的主意,但遗憾的是该软件太旧,不支持其他方法。
我有一个包含用户名和他们使用的计算机的 csv 文件。
例如 (编辑:更改为 CSV 文件格式)
User1,Computer1 User2,Computer2 User3,Computer3
如何获取这些用户名并将其弹出到 xml 文件中,以便它们与正确的计算机名称相对应?
让我们考虑这个用户-computer.csv:
UserName,ComputerName
User1,Computer1
User2,Computer2
User3,Computer3
那么您可以尝试以下操作(使用正确的正确路径进行修改,在此演示中使用当前目录):
Import-Csv -Path .\user-computer.csv | ForEach-Object {
#$_ is the current object
#Your "xml" is not a valid xml file as it doesn't have a root element, so we should use text replacement to modify the files.
(Get-Content -Path ".$($_.ComputerName).xml") -replace '(?<=<username>)(.*?)(?=<\/username>)', $_.UserName | Set-Content -Path ".$($_.ComputerName).xml"
}
如果您只想根据 CSV 中的列表验证 computer/user 配对,我将从 CSV 中创建哈希表:
$csv = @{}
Import-Csv 'C:\path\to\your.csv' | % {
$csv[$_.ComputerName] = $_.UserName.Trim()
}
然后像这样进行验证:
Get-ChildItem 'C:\path\to\*.xml' | % {
[xml]$xml = Get-Content $_.FullName
$username = $xml.SelectSingleNode('//username').'#text'.Trim()
if ($username -ne $csv[$_.BaseName]) {
"[{0}] User mismatch: {1}, {2}" -f $_.BaseName, $username, $csv[$_.BaseName]
}
}