Метод переименования у меня не работал (проверено на Windows XP SP3).Я запустил произвольное приложение и попытался переименовать его себе.Не было ни ошибки, ни эффекта вообще.
Однако этот метод работал:
COPY /B app.exe+NUL app.exe
Когда приложение работало, эта команда выдала мне сообщение об ошибке.И когда приложение было отключено, не только эта команда сохранила содержимое файла, но и оставила временную метку изменения без изменений.
Поэтому на вашем месте я бы, вероятно, использовал эту команду (в началепакетный скрипт, как вы сказали) следующим образом:
COPY /B app.exe+NUL app.exe >NUL || (GOTO :EOF)
Оператор ||
передает управление команде / блоку рядом с ним, если предыдущая команда завершилась неудачно (подняло значение уровня ошибки).Таким образом, приведенная выше команда завершит выполнение сценария, если COPY не удалась (что было бы, если бы файл был открыт).
Сообщение об ошибке будет сохранено (поскольку такие сообщения обычно отправляются на так называемое стандартное устройство ошибки ине сбрасываются с перенаправлением >NUL
, в то время как другие сообщения, не связанные с ошибками, обычно отправляются на стандартный вывод и поэтому могут подавляться с помощью >NUL
) и служат объяснением преждевременного завершения сценария.Однако, если вы хотите отобразить собственное сообщение, вы можете попробовать что-то вроде этого:
COPY /B app.exe+NUL app.exe >NUL 2>NUL || (ECHO Target file inaccessible& GOTO :EOF)
В то время как >NUL
скрывает все, что отправлено на стандартный вывод, 2>NUL
делает то же самое для стандартногоошибка.