问候和节日快乐!
我希望这个问题在其他地方没有得到解答,因为我现在已经搜索了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的中级知识(虽然我发誓每天都会变得更好),所以任何有关如何最好地完成此任务的帮助或建议都将受到赞赏。谢谢!
答案 0 :(得分:2)
这是大多数人在开始使用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]
}
另一个常见的解决方案是添加一个这样的参数块:
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:scope,可以让你在像这样的脚本块中访问你的变量。
Invoke-Command -ComputerName $comp -ScriptBlock {
Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUServer -Type String -Value $Using:WUServerDesConfig
}
我花时间指出其他方法来帮助其他有此问题的方法。
答案 1 :(得分:0)
使用-ArgumentList参数将局部变量传递给脚本块:
Invoke-Command -ComputerName $comp -ScriptBlock {Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUServer -Type String -Value $args[0] } -ArgumentList $WUServerDesConfig