#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!