我在 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
}