PowerShell和Machine.config帮助
我对PowerShell非常陌生,如果可能的话,需要快速帮助(我相信这是一个普遍的句子)。我正在编写一个脚本来优化服务器以成为Web服务器,我需要使用PowerShell编写到machine.configs。我已经有了所有所需的优化,不需要在这方面提供帮助。
我已经试图解决了一个月,也进行了很多谷歌搜索,但我实在找不到解决方案,所以我想来请教专家们。希望我能够在PowerShell方面变得更加优秀,并在某些时候做出贡献。
到目前为止,我已经走得很远,并且已经完成了所有的优化和大部分的PowerShell,但是在脚本的1个部分卡住了。
我需要获取机器有多少CPU核心,我有这行代码
$property = "numberOfCores" Get-WmiObject -class win32_processor -Property $property | Select-Object -Propert $property
这告诉我有几个核心,这正是我需要的,但一旦我知道了机器有多少核心,我需要写入一些值到machine.config中。
在system.web下,它有这些值
<system.web>
<processModel autoConfig="true"/>
我需要用下面列出的值覆盖已有的值。
<system.web>
<processModel maxWorkerThreads="370" maxIoThreads="370" minWorkerThreads="50" minIoThreads="50"/>
<httpRuntime minFreeThreads="90" minLocalRequestFreeThreads="80"/>
除了我无法弄清楚如何编写那行代码之外,我需要将minfreethreads乘以CPU核心数,并将该值写入90的位置,minLocalRequestFreeThreads 80同理。
例如,如果计算看到2个核心,它会编写以下行:
<processModel maxWorkerThreads="370" maxIoThreads="370" minWorkerThreads="50" minIoThreads="50"/>
<httpRuntime minFreeThreads="180" minLocalRequestFreeThreads="160"/>
之后,我需要添加。
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "200" />
</connectionManagement>
</system.net>
如之前所述,将200替换为CPU核心数与200相乘的值。希望这不会太难做到,我不知道如何编写XML文件,然后还要将核心数乘以该值并添加到那里。
因此,它应该像这样:
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "400" />
</connectionManagement>
</system.net>
有人能帮我一下吗?
编辑 1/4
这是我目前的代码,虽然还有很长的路要走,但我正在逐行进行编写,因此某些部分可能无法正常工作,但我认为我走在了正确的道路上。
$xml = New-Object XML
$xml.Load("C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config")
$Path = "C:\Windows\Microsoft.Net\Framework\V2.0.50727\config"
$File = "machine.config"
$current_path = $path + "\" + $file
$text = (get-content ($current_path))
$xml = [XML] (get-content ($current_path))
$p.RemoveAttribute("autoConfig")
$p = $xml.configuration."system.web".processModel
$p.SetAttribute("maxWorkerThreads", "370")
$p.SetAttribute("maxIoThreads", "370")
$p.SetAttribute("minWorkerThreads", "50")
$p = $xml.configuration."system.web".httpRunTime
$p.SetAttribute("minFreeThreads", "90")
$p.SetAttribute("minLocalRequestFreeThreads", "80")
$processor = (Get-CimInstance Win32_processor -Property NumberOfLogicalProcessors | Select -ExpandProperty "NumberOfLogicalProcessors")
$minFT = $processor * 90
$minFT = [string]$minFT
$minFT * 2
$p.SetAttribute("minFreeThreads", [string]$minFT)
$xml_content = [xml]@'
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "200" />
</connectionManagement>
</system.net>
'@
编辑 1/11
实际上失败了,并显示以下消息:
方法调用失败,因为[System.Object []]不包含名为“op_Multiply”的方法。 位于C:\Install\Pre4.ps1的124个字符处: +$httpRuntimexml.setAttribute("minFreeThreads",90 * $numberOfCores) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation:(op_Multiply:String)[],RuntimeException + FullyQualifiedErrorId : MethodNotFound
方法调用失败,因为[System.Object []]不包含名为“op_Multiply”的方法。 位于C:\Install\Pre4.ps1的125个字符处: +$httpRuntimexml.setAttribute("minLocalRequestFreeThreads",80 * $numberOfCores) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation:(op_Multiply:String)[],RuntimeException + FullyQualifiedErrorId : MethodNotFound
方法调用失败,因为[System.Object []]不包含名为“op_Multiply”的方法。 位于C:\Install\Pre4.ps1的130个字符处: + + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation:(op_Multiply:String)[],RuntimeException + FullyQualifiedErrorId : MethodNotFound
----- 脚本 ------
$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")