使用scriptblock和here-string中的变量



我用script-block开始一个脚本:

[scriptblock]$HKCURegistrySettings = {
        Set-RegistryKey -Key 'HKCUSoftwareMicrosoftOffice14.0Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID
        Set-RegistryKey -Key 'HKCUSoftwareMicrosoftOffice14.0Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID $UserProfile.SID
        Set-RegistryKey -Key 'HKCUSoftwareMicrosoftWindowsCurrentVersionRunOnce' -Name 'blabla' -Value 1 -Type DWord -SID $UserProfile.SID
    }

所以它必须是这个样子。

好的,但是我需要一个变量。

$HKCURegistrySettings2 = {
@"
        set-RegistryKey -Key 'HKCUSoftwareMicrosoftOffice14.0Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID
        Set-RegistryKey -Key 'HKCUSoftwareMicrosoftOffice14.0Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID $UserProfile.SID
        Set-RegistryKey -Key 'HKCUSoftwareMicrosoftWindowsCurrentVersionRunOnce' -Name `'$test`' -Value 1 -Type DWord -SID $UserProfile.SID
"@
}

$test代替blabla

$test="blabla"
$test3=&$HKCURegistrySettings2
$test3
[ScriptBlock]$HKCURegistrySettings3 = [ScriptBlock]::Create($test3)

$HKCURegistrySettings -eq $HKCURegistrySettings3

那么现在通过比较第一个$HKCURegistrySettings和现在的$HKCURegistrySettings3

它们应该相同。但我得到的是假的。1. 为什么它们不同?2. 我怎样才能使它们完全相同呢?3.变量是在Here-strings创建之后定义的。其他选择吗?

当scriptblock被创建时,它被用来调用一个函数最初:

Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings
现在

Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings3

所以这就是为什么结果应该是相同的。

谢谢,

HKCURegistrySettings2也扩展了其他变量,所以$test3字符串不再有$UserProfile.SID,它被扩展了。通过在PS命令提示符中运行"$HKCURegistrySettings""$HKCURegistrySettings3"来比较内容。

您可以通过使用`$而不是$来转义不需要展开的变量:

$HKCURegistrySettings2 = {
@"
        set-RegistryKey -Key 'HKCUSoftwareMicrosoftOffice14.0Common' -Name 'qmenable' -Value 0 -Type DWord -SID `$UserProfile.SID
        Set-RegistryKey -Key 'HKCUSoftwareMicrosoftOffice14.0Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID `$UserProfile.SID
        Set-RegistryKey -Key 'HKCUSoftwareMicrosoftWindowsCurrentVersionRunOnce' -Name `'$test`' -Value 1 -Type DWord -SID `$UserProfile.SID
"@
}

然后比较裁剪后的内容:

"$HKCURegistrySettings".trim() -eq "$HKCURegistrySettings3".trim()
真正

您的ScriptBlock可以接受参数,就像函数一样。例如:

$sb = { param($x) $a = 'hello'; echo "$a $x!"; }
& $sb 'Powershell'

应该打印Hello Powershell!

相关内容

  • 没有找到相关文章

最新更新