Как выполнить команду выбора, но ничего не делать

В моем пакетном сценарии используется команда выбора. И в моем сценарии я хотел бы проверить, существует ли файл selection.exe, потому что это приложение имеет команду выбора.

И я точно знаю, как это сделать. Выполнив команду выбора и сделав так, чтобы в случае неудачи она вышла из скрипта

choice || goto:nochoiceapp

:nochoiceapp
echo Cannot continue with script
echo Your system doesn't have choice.exe
pause

Но я хочу сделать это в начале моего сценария. Не только тогда, когда нужна команда выбора.

И я хочу, чтобы это только проверяло, существует ли selection.exe, а не выполнял выбор. Это привело бы к подсказке выбора

Как мне сделать так, чтобы он выполнял команду выбора, но ничего не делал?


person Sean Armecin    schedule 16.12.2020    source источник
comment
Вы также можете рассказать мне о других способах проверки существования selection.exe.   -  person Sean Armecin    schedule 16.12.2020
comment
Ваш метод потерпит неудачу, потому что код после || всегда будет выполняться, поскольку choice всегда устанавливает ErrorLevel; вы можете использовать where choice > nul 2>&1 && (echo found) || (echo not found), чтобы узнать, существует ли команда…   -  person aschipfl    schedule 16.12.2020
comment
Я проверил свой метод, и то, что вы говорите, верно. Но если бы я использовал ваш, мне пришлось бы проверить, существует ли where.exe, поскольку это приложение, которое имеет команду where.   -  person Sean Armecin    schedule 16.12.2020
comment
Шон, это отличное наблюдение, особенно потому, что where.exe не была встроена до Windows Vista, тогда как choice.exe была, (хотя по какой-то причине она была исключена в Windows 2000 и XP). Однако обратите внимание, что в Windows 2003 есть файл selection.exe и все версии Windows Vista, которая была выпущена более четырнадцати лет назад, поэтому в какой-то момент вам следует принять решение не поддерживать кого-либо, использующего устаревшую и, скорее всего, небезопасную операционную систему.   -  person Compo    schedule 16.12.2020


Ответы (2)


Choice — это обычный системный исполняемый файл, расположенный в System32. Вы можете просто проверить, что файл существует.

if not exist "%SystemRoot%\System32\choice.exe" goto :nochoiceapp
person SomethingDark    schedule 16.12.2020
comment
Благодарю вас! Я даже не знал, что существует %SystemRoot% - person Sean Armecin; 16.12.2020
comment
Обратите внимание, что с этим методом вы должны в остальной части вашего скрипта также использовать %SystemRoot%\System32\choice.exe каждый раз, когда вы используете утилиту. Это предотвратит потенциальные проблемы с легко изменяемыми переменными, поскольку choice.exe по-прежнему будет полагаться на %Path%, и, что еще хуже, choice будет полагаться и на %Path%, и на %PATHEXT%. - person Compo; 16.12.2020
comment
Вы хотите сказать, что вместо выбора команды я должен заменить его на %SystemRoot%\System32\choice.exe? - person Sean Armecin; 16.12.2020
comment
Да, @SeanArmecin, и, по моему мнению, каждый всегда должен использовать эту методологию все время, вместо того, чтобы предполагать, что злонамеренных или случайных изменений не произошло. Конечно, вы можете определить переменную самостоятельно, чтобы включить путь, а затем просто использовать эту переменную в своем коде, например. Set "Choice=%SystemRoot%\System32\choice.exe", затем, конечно же, If Not Exist "%Choice%" GoTo nochoiceapp, а в дальнейшем команды %Choice% /C … или "%Choice%" /C … - person Compo; 16.12.2020

Вот альтернатива, которая позволяет утилите Microsoft choice.exe располагаться в текущем каталоге, где-то в %PATH%, или определяться в реестре как непосредственно исполняемый файл.

choice.exe /D N /T 0 2> NUL 1>&2 & If Not ErrorLevel 2 GoTo nochoiceapp

Идея состоит в том, что он автоматически вводит N в подсказку [Y,N]? по умолчанию, что означает, что если ErrorLevel не является 2, исполняемый файл не существовал ни в одном из мест, или он существовал, но не был правильной утилитой.

Обратите внимание, что для языков, не использующих N в качестве параметра "Нет" по умолчанию, необходимо соответствующим образом изменить N.

person Compo    schedule 16.12.2020
comment
вы можете сделать его независимым от языка, используя /c yn. - person Stephan; 16.12.2020
comment
Спасибо за дополнительную информацию @Stephan, я знал об этом как о дополнительной опции и, полагаю, должен был упомянуть об этом. Причина, по которой я этого не сделал, заключалась в том, чтобы просто сохранить код достаточно коротким, чтобы его стоило публиковать, учитывая, что ответ уже был принят. - person Compo; 16.12.2020