powershell - 在 powershell 中写入 machine.config 文件

标签 powershell

我已经在这个脚本上工作了很长一段时间,但不得不暂停它,因为我无法花时间在它上面。我现在可以更加专注于它,但它似乎不太正常,希望我能得到一些帮助。

此脚本旨在首先删除 machine.config 中的一个部分,即 ,ProcessModel autoConfig="true"/> 行

$node = $machineConfig.SelectNodes("/configuration/system.web") 
$node.RemoveChild(($node.SelectSingleNode("processModel"))) | Out-Null

然后它将以下内容写回 processModel

<system.web>
    <processModel maxWorkerThreads="370" maxIoThreads="370" minWorkerThreads="50" minIoThreads="50"/>
<httpRuntime minFreeThreads="90" minLocalRequestFreeThreads="80"/>

然后这里有点棘手,我希望它将 90 和 80 乘以虚拟机上的 CPU 核心数。例如,如果机器有 4 个核心,它将读取

<system.web>
    <processModel maxWorkerThreads="370" maxIoThreads="370" minWorkerThreads="50" minIoThreads="50"/>
<httpRuntime minFreeThreads="360" minLocalRequestFreeThreads="320"/>

之后,在文件底部,我希望添加以下行

<system.net>
<connectionManagement>
<add address = "*" maxconnection = "200" />
</connectionManagement>
</system.net>

与上一个一样,我需要将 200 乘以虚拟机的 CPU 核心数。例如,如果机器有 4 个核心,它将显示为

<system.net>
<connectionManagement>
<add address = "*" maxconnection = "800" />
</connectionManagement>
</system.net>

我的代码所做的是写出 processModel 部分,但它对我来说并没有相乘,而且似乎没有添加 maxconnection 数,只是留下了一个空格。这是我到目前为止的代码

$numberOfCores = Get-WmiObject -class win32_processor numberOfCores | Select-Object -ExpandProperty numberOfCores
$path = "c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config"
[xml]$machineConfig = Get-Content $path
$node = $machineConfig.SelectNodes("/configuration/system.web") 
$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
[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:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config")

我已经为此苦苦挣扎了将近一年,我不得不摆脱它,然后再回来,我发现它不起作用。

出现以下错误

enter image description here

此外,它还会扭曲 machine.config 文件的原始格式。 Machine.config 位于 Windows Server 2012 R2 文件系统中,因此如果您想在自己的计算机上测试该文件,只需确保先备份该文件即可。我讨厌你为了帮助我而搞乱你自己的机器。

最佳答案

为什么不使用设计用于配置的类?

$numberOfCores = Get-WmiObject -class win32_processor numberOfCores | Select-Object -ExpandProperty numberOfCores

$machineConfig = [System.Configuration.ConfigurationManager]::OpenMachineConfiguration()

$processModel = $machineConfig.SectionGroups['system.web'].ProcessModel
$processModel.SectionInformation.RevertToParent()
$processModel.MaxWorkerThreads = 370
$processModel.MaxIOThreads = 370
$processModel.MinWorkerThreads = 50
$processModel.MinIOThreads = 50

$httpRuntime = $machineConfig.SectionGroups['system.web'].HttpRuntime
$httpRuntime.MinFreeThreads = 90 * $numberOfCores
$httpRuntime.MinLocalRequestFreeThreads = 80 * $numberOfCores

$connectionManagement = $machineConfig.SectionGroups['system.net'].ConnectionManagement
$connectionManagement.ConnectionManagement.Add((New-Object System.Net.Configuration.ConnectionManagementElement *, (200 * $numberOfCores)))

$machineConfig.Save()

关于powershell - 在 powershell 中写入 machine.config 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39925805/

相关文章:

powershell - 如何通过属性名称获取对象的属性值?

powershell - 使用 powershell 获取返回对象中的第一个值

powershell - Terraform GCP 无法为 Windows 实例运行元数据命令来创建用户

powershell - 选择对象 - 保留默认列但添加一列

powershell - 如何通过 powershell 运行 appref-ms (clickOnce) 应用程序

powershell - 如何使用 Azure DevOps API 列出对项目存储库具有权限的组/用户?

powershell - 创建/提取zip文件并覆盖现有文件/内容

powershell - 检查服务是否被禁用

新实例中的 PowerShell 启动脚本

windows - 在 PowerShell v2 中打破 foreach 循环