2016-10-08 23 views
1

私はスクリプトブロックでスクリプトを開始しました:使用してスクリプトブロック内の変数と、ここで、文字列

[scriptblock]$HKCURegistrySettings = { 
     Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID 
     Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID $UserProfile.SID 
     Set-RegistryKey -Key 'HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce' -Name 'blabla' -Value 1 -Type DWord -SID $UserProfile.SID 
    } 

だから、これはそれが見なければならないものです。

いいえ、変数が必要です。

$HKCURegistrySettings2 = { 
@" 

     set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID 
     Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID $UserProfile.SID 
     Set-RegistryKey -Key 'HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce' -Name `'$test`' -Value 1 -Type DWord -SID $UserProfile.SID 
"@ 
} 

だから私は$testblablaを交換してください。私の最初の$HKCURegistrySettingsと私は今$HKCURegistrySettings3

は、彼らが同じでなければなりませんを比較することにより、

$HKCURegistrySettings -eq $HKCURegistrySettings3

だから今

$test="blabla" 
$test3=&$HKCURegistrySettings2 
$test3 

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

。しかし、私は偽を得る。 1.なぜ彼らは異なっていますか? 2.それらを同一にするにはどのようにすればよいですか? 3.変数はHere-stringsの作成後に定義されます。その他のオプション?

スクリプトブロックは、その後、最初の関数 を呼び出すために使用されて作成することです。結果は同じでなければなりませんだから、なぜこれがある

Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings 

となりまし

Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings3 

おかげで、

答えて

1

HKCURegistrySettings2は、それが拡張されていますので、$test3文字列はもはや$UserProfile.SIDを持って、あまりにも他の変数を展開しません。 PSコマンドプロンプトで"$HKCURegistrySettings""$HKCURegistrySettings3"を実行して内容を比較してください。

あなたが代わりに$`$を使用して展開を必要としないこれらの変数から逃れることができます。

$HKCURegistrySettings2 = { 
@" 

     set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID `$UserProfile.SID 
     Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID `$UserProfile.SID 
     Set-RegistryKey -Key 'HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce' -Name `'$test`' -Value 1 -Type DWord -SID `$UserProfile.SID 
"@ 
} 

をそして、トリミングされた内容の比較:

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

0

あなたのScriptBlock c関数と同様にパラメータを取る。たとえば:

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

は印刷する必要がありますHello Powershell!

関連する問題