【问题标题】:Powershell Set-ItemProperty: How does one pass a variable to the -value parameter?Powershell Set-ItemProperty:如何将变量传递给-value参数?
【发布时间】:2014-12-17 10:05:21
【问题描述】:

问候和节日快乐!

我希望这个问题没有在其他地方得到回答,因为我已经搜索了 Stack 和 Google 大约一个小时,但还没有看到可以准确回答我想要完成的问题的示例或帖子。

我创建了一个脚本来检查 WindowsUpdateWindowsUpdate\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 的了解只有中级(尽管我发誓,我每天都在进步),因此对于如何最好地完成此任务的任何帮助或建议将不胜感激。谢谢!

【问题讨论】:

    标签: windows powershell registry


    【解决方案1】:

    这是大多数人在开始使用 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: 范围,可以让您访问像这样的脚本块中的变量。

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

    我花时间指出了其他方法来帮助遇到此问题的其他人。

    【讨论】:

    • 感谢 Kevmar 的深入而简单的解释。我现在完全明白为什么这不起作用了,这完全有道理(事实上,我认为在某种程度上我知道这一点,哈哈)。为了我的目的,我决定使用 $using:WUServerDesConfig,它就像一个魅力。谢谢你!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多