Как я могу удалить раздел XML с помощью PowerShell?

#xml #powershell

#xml #powershell

Вопрос:

Приведенный ниже скрипт фиксирует количество ядер процессора на компьютере. В случае, если сценарий был запущен ранее, он удаляет части сценария, которые могли остаться после неудачных попыток, а затем записывает их обратно.

Он записывает httpruntime, Processmodel вместе с потоками maxworker, maxworkerthreads, maxiothreads, minworkerthreads, miniotheads, затем minfreethreads, minlocalrequestfreethreeads, а затем умножает 90 и 80 из minfreetheads и local requestfreethreads на количество ядер процессора.

Затем я хочу, чтобы он удалял трансы, если он существует, тогда он записывает структуру, добавляя connectionmanagement и add address вместе со строкой maxconnection, которая добавляет число 200, а затем умножает в 200 раз количество ядер процессора.

Вот приведенный ниже код

 $numberOfCores = Get-WmiObject -class win32_processor | Measure-Object numberOfCores -Sum | Select-Object -ExpandProperty sum
$path = "C:WindowsMicrosoft.NETFramework64v4.0.30319Configmachine.config"
[xml]$machineConfig = Get-Content $path
$node = $machineConfig.SelectNodes("/configuration/system.web") 
$node.RemoveChild(($node.SelectSingleNode("httpRuntime"))) | Out-Null
$node.RemoveChild(($node.SelectSingleNode("processModel"))) | Out-Null
$processModelxml = $machineConfig.CreateElement("processModel")
$processModelxml.setAttribute("maxWorkerThreads",370)
$processModelxml.setAttribute("maxWorkerThreads",370)
$processModelxml.setAttribute("maxIoThreads",370)
$processModelxml.setAttribute("minWorkerThreads",50)
$processModelxml.setAttribute("minIoThreads",50)
$node.AppendChild($processModelxml) | Out-Null
$httpRuntimexml = $machineConfig.CreateElement("httpRuntime")
$httpRuntimexml.setAttribute("minFreeThreads",90 * $numberOfCores)
$httpRuntimexml.setAttribute("minLocalRequestFreeThreads",80 * $numberOfCores)
$node.AppendChild($httpRuntimexml) | Out-Null
$node = $systemnetxml.SelectSingleNode('//system.net')
$node.ParentNode.RemoveChild($node)
[xml]$systemnetxml = @"
  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "$(200 * $numberOfCores)" />
    </connectionManagement>
  </system.net>
"@
$machineConfig.configuration.AppendChild($machineConfig.ImportNode($systemnetxml."system.net",$true)) | Out-Null
$machineConfig.Save("C:WindowsMicrosoft.NETFramework64v4.0.30319Configmachine.config")
  

Вот часть обновления machine.config, к которой это относится, и обратите внимание на дополнительный system.nets

machine.config

     <configuration>
      <system.web>
    <processModel maxWorkerThreads="370" maxIoThreads="370" minWorkerThreads="50" minIoThreads="50" />
    <httpRuntime minFreeThreads="180" minLocalRequestFreeThreads="160" />
  </system.web>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="400" />
    </connectionManagement>
  </system.net>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="400" />
    </connectionManagement>
  </system.net>
</configuration>
  

возвращаясь только к вашему коду, по-прежнему воспроизводит тот же раздел, но не выводит «connectionManagement: connectionManagement», как я упоминал ранее

Ответ №1:

Канонический способ — удалить узел из его родительского узла:

 [xml]$machineConfig = Get-Content $path
...
$node = $machineConfig.SelectSingleNode('//system.net')
$node.ParentNode.RemoveChild($node)
  

Комментарии:

1. Большое вам спасибо за ответ на Ansgar, но, похоже, он не работает, я получаю эту ошибку

2. подразделение не может вызвать метод для выражения с нулевым значением. В C:UsersICastilloDesktopPre — Final-Alpha3.ps1:141 символ: 1 $node = $xml.SelectSingleNode(‘//system.net’) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo : недопустимая операция: (:) [], исключение RuntimeException FullyQualifiedErrorId : InvokeMethodOnNull

3. не преобразовывайте аргумент «0» со значением: «System.Xml.XPathNodeList», чтобы «removeChild» вводил «System.Xml.XmlNode»: «Невозможно преобразовать значение «System.Xml.XPathNodeList» типа «System.Xml.XPathNodeList» в тип «System.Xml .XmlNode».» В C:UsersICastilloDesktopPre — Окончательный-Alpha3.ps1:142 символа: 1 $ узел. parentNode.removeChild($node) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Информация о категории : не указано: (:) [], исключение метода FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

4. Строка 141 — это $node = $xml.SelectSingleNode(‘//system.net ‘) Строка 142 — это $node. parentNode.removeChild($node)

5. @IggyCastillo Очевидно, что вам нужно заменить $xml на любую переменную, содержащую прочитанный объект XML machine.config . Для получения дополнительной помощи: обновите свой вопрос соответствующей частью вашего скрипта и полным сообщением об ошибке.