Перенаправление cmd: эквивалент bash exe c> файла - PullRequest
1 голос
/ 23 февраля 2020

В bash, с

exec >file

весь вывод из stdout будет перенаправлен.

Есть ли эквивалентность в windows cmd.exe?

== PS ==

Зачем это нужно?

В нашем приложении, где требуется поддержка встроенной оболочки (cmd.exe на windows), добиться лучших результатов Поддержка текстового поиска, мы решили отделить выполнение команд от вывода вывода.

В bash мы использовали exec >file, чтобы добиться того, что работает без проблем. Но моего опыта работы с cmd недостаточно, чтобы найти эквивалентную команду в windows.

== EDIT ==

, чтобы уточнить, что exec >file делает в bash

после exec >file в bash, дескриптор файла 1, т.е. его стандартный вывод перенаправляется на file. который отличается от mycommand >file.

В первом случае stdout самой оболочки перенаправляется, stdout любой команды, выполняющейся внутри нее, технически не перенаправляется, но, поскольку это дочерний процесс оболочки, stdout наследуется , таким образом, запустите ls после того, как exec >file, вывод ls запишет в `file.

В последнем случае stdout самой оболочки не изменился, перенаправляется только stdout дочернего процесса (через shell, его родительский процесс).

Итак, я спрашиваю, как перенаправить стандартный вывод cmd.exe, а затем использовать cmd.exe в обычном режиме, как обычно, кроме cmd.exe ничего не записывать в консоль, все выходная запись в файл.

Таким образом, следующие подходы не то, что я преследую

  • dir >file
  • wrap_several_command_to_batch_file >file
  • wrap_several_command_to_batch_file_and_redirect_inside_then_exit

1 Ответ

1 голос
/ 23 февраля 2020

Нет эквивалента команде exec.

Но его можно эмулировать, перезапустив собственный пакетный файл.
Это работает только для всех команд в самом пакетном файле, но заканчивается при завершении пакета.

@echo off
REM *** Trampoline jump for function calls of the form ex. "C:\:function:\..\ownBatchFile.bat"
FOR /F "tokens=3 delims=:" %%L in ("%~0") DO goto :%%L

REM *** Emulated exec
REM *** Restart this batch file with the function name inside %0
REM *** Parameters are appended, but works only for simple parameters

call "%~d0\:exec:\..\%~pnx0" %* > file
exit /b

:exec
echo This will be redirected

Если Вы также хотите перенаправить из командной строки, есть две разные возможности.

  1. Запуск cmd с перенаправлением.

cmd /k > file

Нарушение работы с файлами из-за сбоев восстановления перенаправления.
Перенаправление работает, но не может быть восстановлено позже (только при выходе из экземпляра cmd).
Подробнее о Больше удовольствия от перенаправления и файловые дескрипторы

echo dummy >NUL 2> nul 3> file

Второй пример работает, потому что, когда существует несколько перенаправлений одновременно, восстановление файловых дескрипторов завершается неудачно, потому что порядок cmd.exe выполняет восстановление в неправильном порядке.

...