Powershell Set-ItemProperty:如何将一个variables传递给-value参数?

问候和节日快乐!

我希望这个问题还没有在其他地方得到答复,因为我已经search了Stack和Google大约一个小时,还没有看到例子或post,正是我想要完成的事情。

我创build了一个脚本,用于检查WindowsUpdateWindowsUpdate \ AUregistry项以及关联的值以获取正确的数据configuration。 如果它们与期望的configuration不一致,则纠正它们。 我在家,所以下面的脚本不完全是我在工作中创build它(我获得了我的registry项/值不同),但应该给你一个我想要做的一般概念:

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} } 

这是行不通的,看起来背后的原因是你不能将一个普通的variables传递给Set-ItemProperty-value参数(我相信它需要一个对象)。 为什么这是,我绝对不知道,因为如果我只是用string本身replacevariables,它没有任何事情。 但是,这种方法的问题是,根据地区,服务器会发生变化。

我认为自己到目前为止只有PowerShell的中间知识(尽pipe我发誓每天都会变得更好),所以对于如何最好地完成这个任务的任何帮助或build议将不胜感激。 谢谢!

这是大多数人在开始使用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] } 

另一个常见的解决方法是像这样添加一个param块:

 Invoke-Command -ComputerName $comp -ArgumentList $WUserverDesConfig -ScriptBlock { param($param1) Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUserver -Type String -Value $param1 } 

但是有一个解决方案使用范围规则,大部分时间都觉得它更合适。 有一个$ use:scope可以让你在脚本块内访问你的变量。

 Invoke-Command -ComputerName $comp -ScriptBlock { Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUserver -Type String -Value $Using:WUserverDesConfig } 

我花时间指出其他方法来帮助有这个问题的其他人。

使用-ArgumentList参数将本地变量传递给脚本块:

 Invoke-Command -ComputerName $comp -ScriptBlock {Set-ItemProperty -Path HKLM:\\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate -Name WUserver -Type String -Value $args[0] } -ArgumentList $WUserverDesConfig