【发布时间】:2021-09-12 02:47:54
【问题描述】:
我必须在目录中创建一个 xml.config 文件以跳过注册部分。 这个想法是用用户名、用户电子邮件和文本格式的 xml 文件的字符串来定义变量。然后我在目录中创建一个文本文件并添加字符串变量的内容。然后我使用 ConvertTo-XML 将文本文件的内容转换为 xml 并将其保存为 .config 文件。
字符串变量包含 xml 文件内容以及两个变量 username 和 usermail。正在创建文本文件,但不会替换它们。这是powershell代码:
$excluded_users = ("packer", "Public", "systemprofile", "LocalService", "NetworkService", "CitrixTelemetryService")
#Get Username, SID, and location of ntuser.dat for all users. Filtering execluded users.
$ProfileList = gp 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*' |
Select @{ name = "SID"; expression = { $_.PSChildName } },
@{ name = "UserHive"; expression = { "$( $_.ProfileImagePath )\ntuser.dat" } },
@{ name = "Username"; expression = { $_.ProfileImagePath -replace '^(.*[\\\/])', '' } } |
Where-Object { $_.Username -notin $excluded_users }
$usern= $ProfileList.Username
$searcher = [adsisearcher]"(samaccountname=$usern)"
$usermail = $searcher.FindOne().Properties.mail
$userxml= '<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<SourceTree.Properties.Settings>
<setting name="MainWindowWidth" serializeAs="String">
<value>1201.3333333333333</value>
</setting>
<setting name="MainWindowHeight" serializeAs="String">
<value>737.33333333333326</value>
</setting>
<setting name="MainWindowState" serializeAs="String">
<value>Normal</value>
</setting>
<setting name="MainWindowLeft" serializeAs="String">
<value>40</value>
</setting>
<setting name="MainWindowTop" serializeAs="String">
<value>40</value>
</setting>
<setting name="GitWhichOne" serializeAs="String">
<value>1</value>
</setting>
<setting name="AllowModifyConfigFiles" serializeAs="String">
<value>True</value>
</setting>
<setting name="DefaultFullName" serializeAs="String">
<value>Domain-COM\$(usern)</value>
</setting>
<setting name="DefaultEmail" serializeAs="String">
<value>$(usermail)</value>
</setting>
<setting name="LastOpenTabIndex" serializeAs="String">
<value>0</value>
</setting>
<setting name="AnonymousID" serializeAs="String">
<value>f32d3160-f61d-4050-8cb4-e3e4670f9a1c</value>
</setting>
<setting name="AgreedToEULA" serializeAs="String">
<value>True</value>
</setting>
<setting name="AgreedToEULAVersion" serializeAs="String">
<value>20160201</value>
</setting>
<setting name="SSHClientType" serializeAs="String">
<value>PuTTY</value>
</setting>
<setting name="ProxyServerMode" serializeAs="String">
<value>OperatingSystem</value>
</setting>
<setting name="HgWhichOne" serializeAs="String">
<value>-1</value>
</setting>
<setting name="EnableGitSupport" serializeAs="String">
<value>True</value>
</setting>
<setting name="EnableHgSupport" serializeAs="String">
<value>False</value>
</setting>
<setting name="HgPostPullAction" serializeAs="String">
<value>Update</value>
</setting>
<setting name="MainWindowScreenDeviceName" serializeAs="String">
<value />
</setting>
<setting name="AnalyticsHasAgreed" serializeAs="String">
<value>False</value>
</setting>
<setting name="GitSystemPath" serializeAs="String">
<value>C:\Program Files\Git</value>
</setting>
<setting name="HgSystemPath" serializeAs="String">
<value />
</setting>
<setting name="SidebarIsOpen" serializeAs="String">
<value>False</value>
</setting>
<setting name="NotificationGettingStartedShown" serializeAs="String">
<value>True</value>
</setting>
</SourceTree.Properties.Settings>
</userSettings>
</configuration>'
New-Item -Path "C:\Users\$usern\AppData\Local\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0" -ItemType directory -Force
New-Item -Path "C:\Users\$usern\AppData\Local\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.txt" -Force
Add-Content "C:\Users\$usern\AppData\Local\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.txt" $userxml
$userxmlconfig = Get-Content "C:\Users\$usern\AppData\Local\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.txt" | ConvertTo-XML
New-Item -Path "C:\Users\$usern\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.config" -Force
Add-Content "C:\Users\$usern\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.config" $userxmlconfig
New-Item -Path "C:\Users\$usern\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0" -ItemType directory -Force
New-Item -Path "C:\Users\$usern\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.txt" -Force
Add-Content "C:\Users\$usern\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.txt" $userxml
$userxmlconfig = Get-Content "C:\Users\$usern\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.txt" | ConvertTo-XML
New-Item -Path "C:\Users\$usern\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.config" -Force
Add-Content "C:\Users\$usern\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0\user.config" $userxmlconfig
【问题讨论】:
-
更改
$userxml= '<?xml ...'以使用双引号 -$userxml= "<?xml ... "同时修复您在字符串中使用变量的方式。$(usermail)应该是${usermail}或$($usermail)“您在字符串周围使用的引号类型会有所不同。双引号字符串允许替换,但单引号字符串不允许。有时您想要一个或其他,所以你有一个选择。” docs.microsoft.com/en-us/powershell/scripting/learn/deep-dives/… -
或者只是
$usermail。 -
感谢您的回复,丹尼尔。我已将 ' 替换为 " 和其他替换。文件夹已创建,但它们是空的。请再次检查脚本并纠正我,也许我在某处遗漏了一些东西。
-
有不少地方需要改正。首先,我需要知道你对
$userxmlconfig = Get-Content "${localPath}\user.txt" | ConvertTo-Xml的意图是什么? user.txt 的内容已经是 xml 格式,因此不需要ConvertTo-Xml并且实际上会导致问题。看起来 user.txt 和 user.config 应该包含相同的内容——$userxml中的xml? -
是的,user.txt和user.config的内容是一样的。我尝试 ConvertTo-Xml 的原因是将文本格式转换为 XML 格式,然后将其保存为 user.config。我可能是错的。但是,现在当我执行脚本时,我创建了一个带有替换变量的 .txt 文件(这正是我们想要的)。还创建了一个 user.config 文件,如下所示: ``` System.Xml.XmlDocument ``` 这不是我们想要的。
标签: xml powershell syntax automation configuration