首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PowerShell编辑任务序列XML

使用PowerShell编辑任务序列XML
EN

Stack Overflow用户
提问于 2020-06-19 08:20:37
回答 1查看 326关注 0票数 0

除了我的基本命令行经验之外,我还刚刚开始使用PowerShell,而且对于基本批处理文件之外的实际脚本很少有经验。

我很难弄清楚如何使用某种类型的“循环”将值添加到XML文件中。

使用来自YouTube视频的指导(读取和更新XML ),我终于能够使用PowerShell将Application添加到XML文件中。这就是起作用的地方:

代码语言:javascript
复制
$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添加到第2行的xml文件路径,需要使用PowerShell xml工具,第3行是xml文件中的路径,我需要在其中添加GUID第4行,将更改保存回同一个xml文件。

我的问题

我正试图弄清楚如何循环我的四行代码,这些代码都是“什么工作的”,这样我就可以在CSV文件中读取"TS_ID“,然后将"GUID”添加到相应的ts.xml文件中。需要注意的一点是,TS_ID是保存ts.xml文件的文件夹的名称,我想将GUID添加到该文件夹中。

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

我很兴奋能够最终将GUID添加到ts.xml中,但不循环它会比使用GUI在应用程序本身中执行相同任务更困难。

更新

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

代码语言:javascript
复制
<?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用我的编辑提供的测试:

代码语言:javascript
复制
$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“的专家帮助进行最后更新。

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

代码语言:javascript
复制
$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中有它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-19 08:59:16

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

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

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

代码语言:javascript
复制
$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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62466174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档