40

Я пишу сценарий bat, в котором я вызываю программу (например, javac). Для простоты я хочу проверить, существует ли команда, прежде чем ее запустить. т.е. если команда существует в PATH.

Например,

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe
)

Какой лучший способ сделать это в Windows?

8 ответов8

49
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 
12

Приведенный ниже код всегда должен выполняться чисто, без вывода мусора.

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)

Выход:

found javac

Тот же код, что и в одной строке:

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )

Выход:

fail

Обратите внимание, что порядок && и || похоже имеет значение. Кроме того, команда, существование которой вы проверяете, должна возвращаться с уровнем ошибки <= 0, чтобы это работало. Надеюсь, команда имеет /? или аргументы --help, или, как и в случае с Java, команду информации о версии.

5

Самый простой способ - просто запустить команду, но у нее, конечно, есть другие проблемы, поскольку, возможно, вы не хотите запускать случайный процесс.

for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1

альтернатива, которая ищет программу по путям, указанным в переменной среды %PATH% . По сути, это чистая пакетная версия which(1) . Это можно сделать лучше, но по сути это так.

3

Некоторые уточнения к версии ниже. Проверьте, существует ли эта команда, и отключите ненужный вывод.

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found
2

Для моей ситуации. Абсолютно простым способом является использование || или && оператор.

my_command.exe -version 2>NUL && echo "my_command exists"

или же

my_command.exe -version 2>NUL || echo "my_command doesn't exist"
1

Если требуется установка дополнительных инструментов, то в наборе ресурсов есть команда where ; увидеть Windows эквивалент где? ,

В противном случае, для версий Windows, которые не слишком древние, это можно сделать в чистом cmd , как упоминалось в поиске исполняемых файлов Dos, кроме PATH.

1

Я знаю, что это не совсем то, что вы ищете, но с небольшим изменением в логике это должно выполнить то, что вам нужно.

Каждая выполняемая команда имеет код возврата (он же уровень ошибки), если код возврата равен 0 (ноль), команда выполнена успешно, если код возврата больше 0, что-то пошло не так.

Смотрите здесь для более подробной информации.

Что-то вроде -

my_command
if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
)
0

Хотя все эти пути могут работать, почему не встроенный способ?

If exists my_command do echo "my_command exists"

Запустить "если /?"в командной строке для деталей

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .