Вставьте это в начало скрипта BAT или CMD и, возможно, измените то, что происходит в предложении if:
:: To leave command window open if script run from Windows explorer.
@setlocal
@set x=%cmdcmdline:"=%
@set x=%x: =%
@set y=%x:cmd/c=%
@if "%x%" neq "%y%" cmd /k %0 %* && exit || exit
@endlocal
Что это делает, если пользователь дважды щелкнет или вызовет этот скрипт с помощью «cmd / c», он перезапустится с «cmd / k», который оставит сеанс открытым после завершения команды. Это позволяет пользователю выйти или, возможно, сделать что-то еще.
Причина, по которой вы делаете это таким образом, а не другими способами, объясненными в этом ответе, состоит в том, что я обнаружил ситуации, в которых все еще даже при использовании кавычек или других символов оператор IF будет срываться с определенными ситуациями КВ и / с и с пробелами. Таким образом, логика сначала удаляет все цитаты, а затем удаляет все пробелы .. потому что в некоторых случаях после удаления кавычек появляется дополнительный пробел.
set x=%cmdcmdline:"=% <-- removes all quotes
set x=%x: =% <-- removes all spaces
set y=%x:cmd/c=% <-- removes cmd/c from the string saving it to y
Точка выхода && || Выход таков, что если ERRORLEVEL перед выходом равен 0 (успех), он затем прекращает работу, но также, если он не равен 0 (некоторый сбой), он также прекращает работу.
Но вы можете заменить эту часть:
cmd /k %0 %* && exit || exit
с чем-то вроде
set CALLED_WITH_CMD_C=YES
, а затем придумайте свои отличия в остальной части вашего сценария. Затем вам нужно будет переместить или удалить эндокалл.
Символ '@' спереди просто предотвращает эхо, которое вы можете получить, если хотите протестировать.
Не используйте echo on или echo off, поскольку это меняет настройку и влияет на все последующие сценарии, которые вызывают ваш.