Powershell Set-ItemProperty:如何将变量传递给-value参数?

时间:2014-12-17 01:48:33

标签: windows powershell registry

问候和节日快乐!

我希望这个问题在其他地方没有得到解答,因为我现在已经搜索了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的中级知识(虽然我发誓每天都会变得更好),所以任何有关如何最好地完成此任务的帮助或建议都将受到赞赏。谢谢!

2 个答案:

答案 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