Использование переменных в scriptblock и здесь-string

#powershell #scriptblock #herestring

#powershell #scriptblock #herestring

Вопрос:

Я запустил скрипт с помощью 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
"@
}
  

Поэтому я заменяю blabla на $test .

 $test="blabla"
$test3=amp;$HKCURegistrySettings2
$test3

[ScriptBlock]$HKCURegistrySettings3 = [ScriptBlock]::Create($test3)
  

$HKCURegistrySettings -eq $HKCURegistrySettings3

Итак, теперь, сравнивая мой первый $HKCURegistrySettings и мой сейчас $HKCURegistrySettings3

Они должны быть одинаковыми. Но я получаю false . 1. Почему они разные? 2. Как я могу сделать их идентичными? 3. Переменные определяются ПОСЛЕ создания Here-strings . Другой вариант?

Когда scriptblock создается, он затем используется для первоначального вызова функции:

 Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings
  

и теперь

 Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings3
  

Вот почему результат должен быть таким же.

Спасибо,

Ответ №1:

HKCURegistrySettings2 также расширяет другие переменные, поэтому $test3 string больше не имеет $UserProfile.SID , он был расширен. Сравните содержимое самостоятельно, запустив "$HKCURegistrySettings" и "$HKCURegistrySettings3" в командной строке PS.

Вы можете избежать тех переменных, которые не нуждаются в расширении, используя `$ вместо $ :

 $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()
  

Верно

Ответ №2:

Ваш ScriptBlock может принимать параметры, как и функция. Например:

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

Должен выводить Hello Powershell!