Invoke-Command Powershell 中的 If Else
If Else within an Invoke-Command Powershell
我正在尝试 运行 下面的命令来判断此注册表项是否存在,然后 Get-ItemProperty 否则不执行任何操作或显示用于测试的文本。
"SQL Server Product Name" = Invoke-Command -ComputerName $Computer -ScriptBlock {If (Test-Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names") { Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object -FilterScript { (($_.Publisher -like "Microsoft*") -and ($_.DisplayName -like "Microsoft SQL Server*(*-bit)")) } | Select-Object -first 1 -ExpandProperty DisplayName } else {Write-Host "Blah"}}
Else 似乎没有做任何事情,因为现在如果 reg 键不存在,它会将 {} 放入结果而不是 Blah。我不确定 If 语句是否有效,因为我认为它可能只是 运行 Get-ItemProperty 无论如何,因为如果该路径存在,我会得到预期的结果。
您的示例的问题在于 Else
脚本块使用 Write-Host
。当您在远程计算机上执行此操作时,主机是该远程计算机上的 PowerShell 会话。您正在将文本写入远程计算机上没有 GUI 的会话。
要解决此问题,只需删除 Write-Host
cmdlet。当脚本块在远程会话上执行时,引用的文本将连同脚本块输出的任何其他内容一起传回本地会话。
我正在尝试 运行 下面的命令来判断此注册表项是否存在,然后 Get-ItemProperty 否则不执行任何操作或显示用于测试的文本。
"SQL Server Product Name" = Invoke-Command -ComputerName $Computer -ScriptBlock {If (Test-Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names") { Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object -FilterScript { (($_.Publisher -like "Microsoft*") -and ($_.DisplayName -like "Microsoft SQL Server*(*-bit)")) } | Select-Object -first 1 -ExpandProperty DisplayName } else {Write-Host "Blah"}}
Else 似乎没有做任何事情,因为现在如果 reg 键不存在,它会将 {} 放入结果而不是 Blah。我不确定 If 语句是否有效,因为我认为它可能只是 运行 Get-ItemProperty 无论如何,因为如果该路径存在,我会得到预期的结果。
您的示例的问题在于 Else
脚本块使用 Write-Host
。当您在远程计算机上执行此操作时,主机是该远程计算机上的 PowerShell 会话。您正在将文本写入远程计算机上没有 GUI 的会话。
要解决此问题,只需删除 Write-Host
cmdlet。当脚本块在远程会话上执行时,引用的文本将连同脚本块输出的任何其他内容一起传回本地会话。