如何测试powershell中的系统上是否存在程序/可执行文件?

如何测试powershell中的系统上是否存在程序/可执行文件?,powershell,Powershell,我有一个脚本,需要在系统上安装openssl。我想检查一下它是否已安装。我考虑过使用测试路径,但由于此脚本将在许多计算机上运行,因此无法知道用户在何处安装了openssl,或者它是否位于系统路径中 是否有一种方法可以执行类似于测试命令openssl(我知道它不存在)的操作,并获取错误级别或类似的操作以在powershell中返回 非常感谢 可以使用try/catch块执行以下操作: $OpenSSLMissing = $false try {openssl} catch {$OpenSSLMis

我有一个脚本,需要在系统上安装openssl。我想检查一下它是否已安装。我考虑过使用
测试路径
,但由于此脚本将在许多计算机上运行,因此无法知道用户在何处安装了openssl,或者它是否位于系统路径中

是否有一种方法可以执行类似于
测试命令openssl
(我知道它不存在)的操作,并获取错误级别或类似的操作以在powershell中返回


非常感谢

可以使用try/catch块执行以下操作:

$OpenSSLMissing = $false
try {openssl} catch {$OpenSSLMissing = $true}
if ($OpenSSLMissing)
{
    # Do something
}
else
{
    # Do something else
}
使用cmdlet显式测试可执行文件是否只能通过其名称调用(这意味着它们位于
$env:PATH
中列出的目录之一),并且通常用于命令发现

$found = [bool] (Get-Command -ErrorAction Ignore -Type Application openssl)

Write-Verbose -vb "openssl.exe found? $found"
仅当
Get命令
返回输出时,对
[bool]
的强制转换才会计算为
$true
,只有找到可执行文件时才会执行此操作

-类型应用程序
确保只考虑外部程序;默认情况下,
Get命令
查找所有类型的命令,包括
*.ps1
脚本、cmdlet、函数和别名

Get命令本身也允许您通过输出对象的
.Source
属性找到可执行文件的完整路径


或者,如果重要的是可执行文件是否可用,您只需尝试执行实际命令并通过
try
/
catch
处理指示可执行文件不可用的错误:

try {
  openssl ... # your *actual* command, not a test
} catch [System.Management.Automation.CommandNotFoundException] {
  # Handle the error, reflected in $_
  Write-Warning $_
  # ... 
}
请注意,您不需要严格地捕获
[System.Management.Automation.CommandNotFoundException]
,特别是如果您确信唯一可能发生的错误是由于缺少可执行文件,但是请注意,您可能会从基于表达式的参数求值期间发生的错误中获得潜在的误报,例如尝试将
(1/0)
作为参数传递


还请注意,尝试通过在
try
/
catch
语句中不带参数地调用可执行文件来测试其可用性不是一种可行的方法,因为可执行文件可能会进入交互式shell(就像
openssl
一样)或产生不希望的副作用

您可以对公共位置进行一些有根据的猜测,但是坦率地说,通常的方法是要求用户将可执行文件的路径添加到path环境变量中(或者将可执行文件放在已经在路径中的目录中)。因为否则您必须遍历计算机上的所有文件系统,这将花费很长时间。尝试在
try
/
catch
语句中不带参数地调用可执行文件来测试其可用性不是一种可行的方法,因为可执行文件可能会进入交互式shell(就像openssl的情况一样)或产生不希望的副作用。但是,您可以使用
try
/
catch
来尝试实际调用。听到这个消息我很高兴,@DominicBrunetti,我感谢您的反馈。