Тест Powershell, если исполняемый путь

В моем script я собираюсь запустить команду

pandoc -Ss readme.txt -o readme.html

Но я не уверен, установлен ли pandoc. Поэтому я хотел бы сделать (псевдокод)

if (pandoc in the path)
{
    pandoc -Ss readme.txt -o readme.html
}

Как я могу сделать это по-настоящему?

Ответ 1

Вы можете протестировать Get-Command (gcm)

if (Get-Command "pandoc.exe" -ErrorAction SilentlyContinue) 
{ 
   pandoc -Ss readme.txt -o readme.html
}

Если вы хотите протестировать несуществование команды в своем пути, например, чтобы показать сообщение об ошибке или загрузить исполняемый файл (подумайте об NuGet):

if ((Get-Command "pandoc.exe" -ErrorAction SilentlyContinue) -eq $null) 
{ 
   Write-Host "Unable to find pandoc.exe in your PATH"
}

Try

(Get-Help gcm).description

в сеансе PowerShell, чтобы получить информацию о Get-Command.

Ответ 2

На всякий случай некоторые считают это полезным. Вот функция в духе ответа Дэвида Брабанта с проверкой минимальных номеров версий.

Function Ensure-ExecutableExists
{
    Param
    (
        [Parameter( Mandatory = $True )]
        [string]
        $Executable,

        [string]
        $MinimumVersion = ""
    )

    $CurrentVersion = ( Get-Command -Name $Executable -ErrorAction Stop ).Version

    If( $MinimumVersion )
    {
        $RequiredVersion = [version]$MinimumVersion

        If( $CurrentVersion -lt $RequiredVersion )
        {
            Throw "$( $Executable ) version $( $CurrentVersion ) does not meet requirements"
        }
    }
}

Это позволяет сделать следующее:

Ensure-ExecutableExists -Executable pscp -MinimumVersion "0.62.0.0"

Он ничего не делает, если требование выполняется или выдает ошибку, это не так.