将 Powershell 脚本编译成解释代码

Compile Powershell script into interpreted code

如果我说错了标题,请原谅我,但这是我要找的:

假设我有这个脚本:

$secureCiphers = @(
  'AES 128/128',
  'AES 256/256'
)
foreach ($secureCipher in $secureCiphers) {
    $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($secureCipher)
    New-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers$secureCipher" -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force | Out-Null
    $key.close()
    Write-Host "Strong cipher $secureCipher has been enabled."
}

有没有什么东西可以展开循环,为每次迭代赋值并说上面的代码等同于:

$key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey('AES 128/128')
New-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 128/128" -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force | Out-Null
$key.close()
Write-Host "Strong cipher AES 128/128 has been enabled."


$key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey('AES 256/256')
New-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 256/256" -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force | Out-Null
$key.close()
Write-Host "Strong cipher AES 256/256 has been enabled."

然后我可以编写一个自动化测试来说明脚本应该设置这些注册表项并且系统具有这些注册表项的预期值。这个要求有意义吗?脚本比较复杂,有函数和很多if-else语句。

我认为可能更好地为您服务的是将您尝试执行的操作的逻辑抽象为函数(最好是在模块中),这些函数为发生变化的事物采用参数。所以在这种情况下,您将拥有一个函数,该函数采用特定的“安全密码”并执行它需要执行的操作。

一旦你掌握了函数中的逻辑,你就可以围绕函数编写 测试,确保它按预期工作,失败预期 当传递无效条目等时

PowerShell 有一个 testing framework called Pester 有助于编写测试。

现在您已经有了可重复使用的功能,并通过测试证明它有效。

你的脚本应该变成:

$secureCiphers = @(
  'AES 128/128',
  'AES 256/256'
)
foreach ($secureCipher in $secureCiphers) {
  Set-MySecureCipher -Cipher $secureCipher
}

或者,如果您编写的函数能够接受管道输入,则可能是:

$secureCiphers | Set-MySecureCipher

我省略了很多细节,以便从高层次进行解释,但您可以继续研究这些领域中的每一个:

  • 编写函数
  • 编写 PowerShell 模块
  • 编写 Pester 测试
  • 编写高级函数(接受管道输入,supporting ShouldProcess for -WhatIf support)