【问题标题】:Edit Task Sequence XML using PowerShell使用 PowerShell 编辑任务序列 XML
【发布时间】:2020-10-09 11:11:35
【问题描述】:

除了基本的命令行经验之外,我还没有使用 PowerShell,并且对基本批处理文件之外的实际脚本编写经验很少。

我无法弄清楚如何使用某种“循环”将值添加到 XML 文件中。

使用 YouTube 视频(阅读和更新 XML 文件)中的指导,我终于能够使用 PowerShell 将应用程序 GUID 添加到 XML 文件中。这是有效的:

$xmlFilePath = 'C:\Users\Timetriad\Desktop\1PASSWORD-7\ts.xml'
$tsXML = [xml] (Get-Content $xmlFilePath)
$tsXML.sequence.step.defaultVarList.variable[1].'#text' = '{f98806dd-02a4-4863-9b3e-fc83afd9d1e0}'  
$tsXML.Save($xmlFilePath)

第 1 行只是设置了我需要添加 GUID 的 xml 文件路径 使用 PowerShell xml 工具需要第 2 行 第 3 行是 xml 文件中我需要添加 GUID 的路径 第 4 行将更改保存回同一个 xml 文件。

我的问题

我试图弄清楚如何在“WHAT WORKS”上方循环我的四行代码,以便我可以读取 CSV 文件中的“TS_ID”,然后将“GUID”添加到相应的 ts.xml 文件中.需要注意的一点是,TS_ID 是包含我要添加 GUID 的 ts.xml 文件的文件夹的名称。

我的 CSV 文件只有两条两条数据:TS_IDGUID

我很高兴我终于可以将 GUID 添加到 ts.xml,但不循环它比使用 GUI 在应用程序本身中执行相同的任务更加困难。

更新

我添加了一个显示 XML 数据的注释。它看起来很难看,所以我将它添加到我的原始帖子中:

<?xml version="1.0"?>
<sequence version="3.00" name="Custom Task Sequence" description="Sample Custom Task Sequence">
  <step type="BDD_InstallApplication" name="Install Application" description="" disable="false" continueOnError="false" runIn="WinPEandFullOS" successCodeList="0 3010">
    <defaultVarList>
      <variable name="ApplicationGUID" property="ApplicationGUID"></variable>
      <variable name="ApplicationSuccessCodes" property="ApplicationSuccessCodes">0 3010</variable>
    </defaultVarList>
    <action>cscript.exe "%SCRIPTROOT%\ZTIApplications.wsf"</action>
  </step>
</sequence>

由 Cbsch 提供的测试和我的编辑:

$csvData = Import-Csv -Path "C:\Users\Administrator\Desktop\Control\TaskSequence-AppGUID-MDT.csv" -Encoding UTF8 -Delimiter ","
$csvData | ForEach-Object {
    $tsId = $_.TS_ID
    $guid = $_.GUID

    $xmlFilePath = "C:\Users\Administrator\Desktop\Control\$tsId\ts.xml"
    $tsXML = [xml] (Get-Content $xmlFilePath)
    $tsXML.sequence.step.defaultVarList.variable[1].'#text' = "{$guid}"
    $tsXML.Save($xmlFilePath)
}

使用“Cbsch”的专家帮助进行最终更新。

以下是满足我需求的最终结果:

$csvData = Import-Csv -Path "C:\Users\Administrator\Desktop\Control\TaskSequence-AppGUID-MDT.csv"
$csvData | ForEach-Object {
    $tsId = $_.TS_ID
    $guid = $_.GUID

    $xmlPath = "C:\Users\Administrator\Desktop\Control\$tsId\ts.xml"
    $tsXML = [xml] (Get-Content $xmlPath)
    $tsXML.sequence.step.defaultVarList.variable[0].InnerText='#text';
    $tsXML.sequence.step.defaultVarList.variable[0]."#text" = "$guid"
    $tsXML.Save($xmlPath)
}

请注意,我没有将 {} 用于我的 GUID 变量,因为我的 CSV 中有它们。

【问题讨论】:

    标签: xml powershell


    【解决方案1】:

    首先我们需要将 CSV 文件读入一个变量。 Import-Csv 将创建一个对象数组,其属性名称与 CSV 文件中的第一行匹配。确保调整Import-Csv 命令上的参数以匹配文件。同样在Import-Csv 命令之后,您可以执行$csvData | Out-Host 以确保数据看起来正确。

    然后我们将数组通过管道传输到ForEach-Object。在传递给ForEach-Object 命令的ScriptBlock 内,当前对象将被分配给变量$_。为了使事情更具可读性,我将对象中的属性分配给它们自己的变量。

    请注意,要将变量替换为字符串,您必须使用 "" 而不是 ''。我不确定在您的 XML 文件的路径中替换了哪个数字,但您明白了。

    $csvData = Import-Csv -Path "path\to\csv" -Encoding UTF8 -Delimiter ";"
    
    $csvData | ForEach-Object {
        $tsId = $_.TS_ID
        $guid = $_.GUID
    
        $xmlFilePath = "C:\Users\Timetriad\Desktop\1PASSWORD-$tsId\ts.xml"
        $tsXML = [xml] (Get-Content $xmlFilePath)
        $tsXML.sequence.step.defaultVarList.variable[0].InnerText = "{$guid}"
        $tsXML.Save($xmlFilePath)
    }
    

    【讨论】:

    • Cbsch,非常感谢您在这方面的帮助。它可以工作,但由于某种原因,它会将 GUID 添加到错误的位置;我不确定为什么,因为编辑我提供的 xml 文件的代码与您在 LOOP 中使用的代码没有区别。奇怪的是,它正在替换第二个“变量”中的“ApplicationSuccessCode”,而不是将 GUID 添加到尚不存在的第一个 VARIABLE 文本属性中;这就是我想要实现的目标。我想知道我是否遗漏了什么。我在帖子中添加了xml代码以供参考。
    • 是否需要在第一个 VARIABLE 中添加一行来添加 TEXT 元素,然后才能将 GUID 添加到该元素?我尝试将 [1] 更改为 [0],但我收到一条错误消息,提示它不存在。
    • 添加到0 元素是正确的。你是对的,你不能添加到'#text',因为它不存在。但是,如果您这样做,它将起作用$xml.sequence.step.defaultVarList.variable[0].InnerText = "{$guid}"
    • Cbsch....你就是男人!而且您不会相信我只是通过尝试逐个理解这一点而偶然发现了这个解决方案。纯粹是我的运气,但是当我看到你的解决方案时,我相信它会起作用......而且它做到了!我完全相信你,非常感谢你。几个月来我一直想这样做,但一直推迟,因为我只是将我的 WDS/MDT 用于个人用途。我将使用您提供的完整代码和我的个人编辑更新我的原始帖子,要求其他人将您的回复标记为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多