PowerShell 哈希表条件赋值

PowerShell 哈希表条件赋值

我在 PowerShell 脚本中有一个哈希表(通过几个示例缩短了,但其中包含大约 8 个项目):
--此哈希表之前的代码构建了 $i 变量,因此我只会为该示例提供它。它取决于服务器上的 SQL 版本。因此,SQL 2008 R2 默认实例将是“MSSQL10_50.MSSQLServer”。


$i = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER'
$SQLPaths = @{
   'DefaultData'=(Get-ItemProperty "$i\MSSQLServer").DefaultLog;
   'RepWorking'=(Get-ItemProperty "$i\Replication").WorkingDirectory
}

我的问题...在设置值或尝试设置值之前,是否有一种快捷方式可以在哈希表中测试此注册表路径 (Test-Path)?我有一些这样的键,如果从未设置过该功能或设置,则该键实际上不存在。这很好,但如果不存在,我该如何忽略它,而让哈希表中的值保持为空?

答案1

在 PowerShell 中,该if语句可以用作表达式:

$i = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER'
$SQLPaths = @{
   'DefaultData'= if (Test-Path "$i\MSSQLServer") { 
                     (Get-ItemProperty "$i\MSSQLServer").DefaultLog
                  } else {
                     $null
                  };
   'RepWorking'=(Get-ItemProperty "$i\Replication").WorkingDirectory
}

另外如果你使用PowerShell 社区扩展(PSCX)它添加了一个Invoke-Ternary(别名?:)函数,可以使其不那么冗长:

$i = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER'
$SQLPaths = @{
   'DefaultData'= ?: {Test-Path "$i\MSSQLServer"} `
                     { (Get-ItemProperty "$i\MSSQLServer").DefaultLog } `
                     { $null };
   'RepWorking'=(Get-ItemProperty "$i\Replication").WorkingDirectory
}

相关内容