问候,节日快乐!
我希望这个问题没有在其他地方得到解答,因为我已经在 Stack 和 Google 上搜索了大约一个小时,还没有看到能够准确回答我想要完成的事情的示例或帖子。
我创建了一个脚本来检查 WindowsUpdate 和 WindowsUpdate\AU 注册表项以及相关值以确保正确的数据配置。如果它们与所需配置不一致,则会更正它们。我在家,所以下面的脚本并不完全是我在工作中创建它的方式(我以不同的方式获得了我的注册表项/值),但应该让您大致了解我要做什么:
param($comp, [string]$location)
switch($location)
{
"EAST" {$WUServerDesConfig = "https://myeastmp.domain.com:8531"}
"WEST" {$WUServerDesConfig = "https://mywestmp.domain.com:8531"}
}
$WUServerActual = Invoke-Command -ComputerName $comp -scriptblock {(Get-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate).WUServer}
if($WUServerActual -ne $WUServerDesConfig)
{
Invoke-Command -ComputerName $comp -ScriptBlock {Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUServer -Type String -Value $WUServerDesConfig}
}
这不起作用,它背后的原因似乎是您不能将普通变量传递给Set-ItemProperty 的-value 参数(我相信它需要一个对象)。为什么会这样,我完全不知道,因为如果我只是用字符串本身替换变量,它就可以正常工作。然而,这种方法的问题在于,服务器会根据地区而变化。
到目前为止,我认为自己只有 PowerShell 的中级知识(尽管每天都在进步,我发誓),所以任何关于如何最好地完成这项工作的帮助或建议将不胜感激。谢谢!
最佳答案
这是大多数人在开始使用 invoke-command 时遇到的问题。
最常见的解决方案是传递您想要的值并使用 $args 变量,如下所示:
Invoke-Command -ComputerName $comp -ArgumentList $WUServerDesConfig -ScriptBlock {
Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUServer -Type String -Value $args[0]
}
另一种常见的解决方案是像这样添加一个参数 block :
Invoke-Command -ComputerName $comp -ArgumentList $WUServerDesConfig -ScriptBlock {
param($param1)
Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUServer -Type String -Value $param1
}
但是有一个解决方案使用范围规则,在大多数情况下感觉更合适。有一个 $using: 作用域可以让您在这样的脚本 block 中访问您的变量。
Invoke-Command -ComputerName $comp -ScriptBlock {
Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUServer -Type String -Value $Using:WUServerDesConfig
}
我花时间指出了其他方法来帮助遇到此问题的其他人。
关于windows - Powershell 设置项属性 : How does one pass a variable to the -value parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27517117/