【问题标题】:Create a file in xml.config format by replacing a couple of variables using Powershell通过使用 Powershell 替换几个变量来创建 xml.config 格式的文件
【发布时间】: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= '&lt;?xml ...' 以使用双引号 - $userxml= "&lt;?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


【解决方案1】:

您的第一个大问题是$usern= $ProfileList.Username 这一行。 $ProfileList 是找到的一组配置文件,因此 $usern 被分配了一组用户名。我添加了一个 foreach 循环来遍历 $ProfileList 中的每个配置文件并只分配一个用户名。

第二个问题是$userxml。我们需要将文本放在双引号中以允许变量扩展。由于 xml 代码中已经有双引号,我们可以使用 here string @" ... "@

最后,您在已经是 xml 格式的文本上使用了ConvertTo-Xml。删除了这个。而且看起来 user.config 被创建了两次,所以我第二次注释掉了。

没有太多解释,我认为以下应该可行。我在代码中添加了一些 cmets。

$excluded_users = ('packer', 'Public', 'systemprofile', 'LocalService', 'NetworkService', 'CitrixTelemetryService')

#Get Username, SID, and location of ntuser.dat for all users. Filtering excluded users.

$ProfileList = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*' |
    ForEach-Object {
        [PSCustomObject]@{
            SID      = $_.PSChildName
            UserHive = "$( $_.ProfileImagePath )\ntuser.dat"
            Username = $_.ProfileImagePath -replace '^(.*[\\\/])', ''
        }
    } | Where-Object { $_.Username -notin $excluded_users }

# Add foreach to loop through each $ProfileList
$ProfileList | ForEach-Object {
    $username = $_.Username
    $searcher = [adsisearcher]"(samaccountname=$username)"
    $usermail = $searcher.FindOne().Properties.mail

    # Change to here string with double-quotes to allow variable expansion
    # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7.1#here-strings
    $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\$username</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>
"@

    $localPath = "C:\Users\$username\AppData\Local\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0"
    $roamingPath = "C:\Users\$username\AppData\Roaming\Atlassian\SourceTree.exe_Url_yjhzxxhcu2ommegrdorjf3q1oqllqxiq\3.4.5.0"

    New-Item -Path "${localPath}" -ItemType directory -Force    # Create local path
    New-Item -Path "${localPath}\user.txt" -Force               # Create empty user.txt file in local path
    Add-Content "${localPath}\user.txt" $userxml                # Fill user.txt file with content of $userxml

    # $userxmlconfig = Get-Content "${localPath}\user.txt" | ConvertTo-Xml  

    New-Item -Path "${roamingPath}" -ItemType directory -Force  # Move folder creation up

    New-Item -Path "${roamingPath}\user.config" -Force
    Add-Content "${roamingPath}\user.config" $userxml           # Change to $userxml

    New-Item -Path "${roamingPath}\user.txt" -Force
    Add-Content "${roamingPath}\user.txt" $userxml

    # $userxmlconfig = Get-Content "${roamingPath}\user.txt" | ConvertTo-Xml

    # New-Item -Path "${roamingPath}\user.config" -Force
    # Add-Content "${roamingPath}\user.config" $userxmlconfig     

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多