【问题标题】:Writing to the machine.config file in powershell在 powershell 中写入 machine.config 文件
【发布时间】:2016-10-07 21:06:41
【问题描述】:

我已经编写这个脚本很长一段时间了,但由于我无法花时间在上面,所以不得不搁置它。我现在可以更加专注于它,但它似乎不太正常,希望我能得到一些帮助。

此脚本旨在首先删除 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"/>

然后这里就有点棘手了,我希望它乘以虚拟机上的 CPU 核心数,然后乘以 90 和 80。例如,如果机器有 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 部分,但它对我来说并没有相乘,而且它似乎没有添加最大连接数,只是留下了一个空格。这是我到目前为止的代码

$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")

我已经为此苦苦挣扎了将近一年,我不得不摆脱它,而回到它却发现它不起作用。

出现如下错误

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

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

    $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()
    

    【讨论】:

    • 非常感谢您回复我 PetSerAI,很抱歉我没有尽快回复您。我刚刚尝试了您的解决方案,它部分有效。它将 System.Web 放置在正确的位置,并且间距和一切都很完美,但它根本没有添加 system.net 部分,也没有将值相乘。我似乎无法弄清楚如何为错误添加屏幕截图,但它基本上是相同的错误,不包含名为 'op_Multiply' 的方法 -
    • 您只有一个处理器吗? $numberOfCores 对你来说是什么内容?
    • 您好 PetSerAI,我需要它来提取核心数量,因为它并不总是同一台机器,因此核心可能会有所不同,因此优化也会有所不同。
    • @IggyCastillo 在脚本因错误而失败的任何 PC 上,$numberOfCores 的具体内容是什么?
    • 我明白你为什么要问这个问题,我昨天刚刚纠正的那部分,通过将该行更改为
    猜你喜欢
    • 2016-04-05
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多