пакетное перенаправление команды запуска, но не процесса

Мне нужно перенаправить вывод команды запуска в файл log.txt (например, в случае неправильного пути), но не запускаемого ею процесса. Потому что, если process.exe работает дольше, следующий вывод не может быть записан в файл журнала, потому что он заблокирован процессом.

start "" "path\to the\process.exe" >> log.txt 2>&1
echo next output >> log.txt

person Guestík    schedule 03.10.2018    source источник
comment
Пробовали ли вы командную строку START, опубликованную вами? Он записывает сообщение об ошибке, выводимое командой START, в файл log.txt в дополнение к отображаемому подсказке сообщения об ошибке графического интерфейса. Необходимо экранировать каждый оператор перенаправления > и & с помощью ^, чтобы он не интерпретировался как перенаправление вывода команды START в текущем командном процессе.   -  person Mofi    schedule 03.10.2018
comment
Конечно, я пытался. При возникновении ошибки она успешно перенаправляется в файл log.txt. Но когда он находит процесс и запускает его, вывод процесса также перенаправляется, чего я не хочу.   -  person Guestík    schedule 03.10.2018
comment
Когда я попытался настроить строку, как вы мне сказали (начальный путь\к \process.exe ^›^› log.txt 2^›^&1), процесс не перенаправляется (что хорошо), а ошибка сообщение также не перенаправляется в файл журнала. Я что-то упускаю?   -  person Guestík    schedule 03.10.2018
comment
Я не могу воспроизвести вашу проблему. Запущенный процесс не блокирует следующее эхо в моих руках. Также запущенный процесс не пишет в лог. Пожалуйста, предоставьте больше информации о вашем процессе и убедитесь, что вы сообщили нам все параметры START, которые вы используете. Если возможно, вы должны сообщить нам точную стартовую линию, которую вы используете.   -  person dbenham    schedule 03.10.2018
comment
Говоря об этой строке: start path\to\process.exe ^›^› log.txt 2^›^&1 Чего я хочу добиться, так это того, когда ПУТЬ к процессу написан неправильно или просто процесс.exe делает не существует, перенаправьте вывод сообщения об ошибке в файл log.txt. Потому что теперь он пишет сообщение об ошибке в окно консоли.   -  person Guestík    schedule 03.10.2018
comment
@Guestík Я написал, что start "" "path\to the\process.exe" >> log.txt 2>&1 приводит к получению сообщения об ошибке START, записанного в файл log.txt, который вы хотите. start "" "path\to the\process.exe" ^>^> log.txt 2^>^&1 является примером записи стандартного вывода и вывода ошибок process.exe в файл log.txt, который вам не нужен. Итак, как написал dbenham, нам неясно, в чем заключается ваша проблема, потому что то, что вы опубликовали, - это то, что вы хотите и что работает.   -  person Mofi    schedule 04.10.2018


Ответы (1)


Один вариант:

@set _FILE_NOT_FOUND=2
@set _fileToRun=path\to the\process.exe
@if not exist "%_fileToRun%" @echo File to run does not exist: %_fileToRun% >> log.txt & @exit /b -%_FILE_NOT_FOUND%
@start "" "%_fileToRun%"
@if %ERRORLEVEL% neq 0 @echo Start failed with: %ERRORLEVEL%
@echo next output >> log.txt
person jwdonahue    schedule 03.10.2018
comment
Пока ваш ответ работает, у меня есть два предложения по улучшению. 1. Во всех операционных системах настоятельно рекомендуется не закрывать приложение или сценарий с отрицательным числом. Это возможно, но в случае успеха используется значение 0, а в случае ошибки - положительное число. Поэтому, пожалуйста, измените конец второй строки на exit /b 1. 2. Избегайте использования if %ERRORLEVEL% NEQ 0, так как это работает только вне командного блока. Лучше использовать if errorlevel 1, который работает в любом месте командного файла и означает, что код выхода start больше или равен 1, т.е. если была ошибка при запуске исполняемого файла. - person Mofi; 04.10.2018
comment
Запустите в окне командной строки if /? для получения подробной информации о синтаксисе if errorlevel X. Противоположным является if not errorlevel 1, что означает, что код выхода меньше 1, т.е. равен 0, если приложение/скрипт не завершается с отрицательным значением, что верно для всех приложений и скриптов, которые я когда-либо видел, кроме этого. См. раздел Каковы значения ERRORLEVEL, установленные внутренними командами cmd.exe? для кодов выхода команды START . - person Mofi; 04.10.2018
comment
@Mofi, спасибо за советы. Я забыл найти правильное сообщение об ошибке! -1 это моя заметка для себя... Я никогда не помещаю операторы if в командный блок. Я вообще избегаю многострочных блоков кода, их следует избегать любой ценой. - person jwdonahue; 04.10.2018
comment
Семантика if errorlevel 1 — это оксюморон. Кстати, многие программы возвращают отрицательные числа в случае ошибок и нуль или положительные числа в случае успеха. Вы никогда не должны предполагать, что сценарии возвращают положительные значения в случае сбоев. Язык пакетных сценариев Windows слаб и полон ошибок. - person jwdonahue; 04.10.2018
comment
Что означает if errorlevel 1, ясно объяснено в справке по команде IF. Как всегда в мире программирования, важна документация функции/команды, а не понимание пользователем функции/команды. Мне было бы очень интересно, какие программы возвращают отрицательное число. За 25 лет использования компьютера я ни разу такого не видел. Microsoft ясно написала для Windows и в документации ядра Linux, что отрицательные числа не должны использоваться приложениями. Лучше всего использовать только значения в диапазоне от 0 до 255 (диапазон беззнаковых символов) или от 0 до 65535 (диапазон беззнаковых коротких значений). - person Mofi; 05.10.2018
comment
Причина в функции int main(int argc, char* argv[]). int определяется в C/C++ и может содержать по крайней мере диапазон [−32 767, +32 767]. Таким образом, int может быть только 16-битным, как на 16-битных контроллерах, 32-битным или 64-битным, в зависимости от используемого компилятора и для какого процессора/контроллера компилируется программа. Использование отрицательных значений может вызвать проблемы с используемым компилятором, интерпретирующим int с разрядностью, отличной от используемой операционной системы или другого приложения, оценивающего код выхода. По этой причине использование отрицательного значения не запрещено, но действительно не рекомендуется. - person Mofi; 05.10.2018
comment
Но вы правы, никто никогда не должен предполагать, что программа возвращает, а читать ее документацию, или выяснять, если в документации это не описано, или обращаться к автору программы и просить разъяснений относительно кодов выхода. Например, HTML Help Workshop возвращает 0 в случае ошибки и 1 в случае успеха. Это единственное приложение, которое я знаю, которое использует эти противоположные коды выхода, которые обычно используются программами в соответствии с рекомендациями программистов операционных систем. - person Mofi; 05.10.2018