Изменить последовательность задач XML с помощью PowerShell - PullRequest
0 голосов
/ 19 июня 2020
• 1000 использовать какой-то «l oop» для добавления значения в файл XML.

Используя руководство из видео YouTube (чтение и обновление файлов XML), я наконец смог добавить GUID приложения в файл XML с помощью PowerShell. Вот что работает:

$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 просто устанавливает xml путь к файлу, который мне нужен, чтобы добавить GUID в Строку 2, необходимую для использования инструментов PowerShell xml Строка 3 - это путь в файл xml, в который мне нужно добавить строку GUID 4, сохраняет изменения обратно в тот же файл xml.

Моя проблема

Я пытаюсь понять, как я могу l oop мои четыре строки кода выше «ЧТО РАБОТАЕТ», поэтому я могу прочитать «TS_ID» в файле CSV, а затем добавить «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.

1 Ответ

1 голос
/ 19 июня 2020

Сначала нам нужно прочитать файл 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...