除了我的基本命令行经验之外,我还刚刚开始使用PowerShell,而且对于基本批处理文件之外的实际脚本很少有经验。
我很难弄清楚如何使用某种类型的“循环”将值添加到XML文件中。
使用来自YouTube视频的指导(读取和更新XML ),我终于能够使用PowerShell将Application添加到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添加到第2行的xml文件路径,需要使用PowerShell xml工具,第3行是xml文件中的路径,我需要在其中添加GUID第4行,将更改保存回同一个xml文件。
我的问题
我正试图弄清楚如何循环我的四行代码,这些代码都是“什么工作的”,这样我就可以在CSV文件中读取"TS_ID“,然后将"GUID”添加到相应的ts.xml文件中。需要注意的一点是,TS_ID是保存ts.xml文件的文件夹的名称,我想将GUID添加到该文件夹中。
我的CSV文件只有两条数据:TS_ID,GUID。
我很兴奋能够最终将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中有它们。
发布于 2020-06-19 08:59:16
首先,我们需要将CSV文件读入变量中。Import-Csv将创建一个对象数组,其属性名与CSV文件中的第一行相匹配。确保您调整了Import-Csv命令中的参数以匹配该文件。同样,在Import-Csv命令之后,您可以执行$csvData | Out-Host以确保数据看起来正确。
然后我们将数组传输到ForEach-Object中。在传递给ScriptBlock命令的ForEach-Object中,当前对象将被分配给变量$_。为了使事物更具可读性,我将对象中的属性赋值给它们自己的变量。
注意,要将变量替换为字符串,必须使用""而不是''。我不确定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)
}https://stackoverflow.com/questions/62466174
复制相似问题