DOS и / или Windows версии команды Unix SCRIPT

3675
Synetech

Вернувшись в университет, когда нам нужно было отправить задание в CS, мы должны были выполнить ряд шагов, включая запуск script, date, whoami, etc.и запуск нашей программы.

Команда scriptбудет передавать весь текст, отправляемый на дисплей, как на дисплей, так и на указанный файл.

С тех пор я искал версию для Dos и / или Windows, но вышел пустой. Некоторые программы могут быть перенаправлены в файл, но тогда отображение не отображается, а некоторые программы, похоже, вообще не работают с перенаправлением.

Есть идеи?


Редактировать :

Пока что ответы, которые я получил, работают точно так же, как стандартные команды перенаправления ( <, >, |). Они не работают со всеми программами. Например, компилятор Microsoft C ++ CL.EXE. Если вы выполните cl /?команду перенаправления или передадите ее через другую программу (например, TEE), вы не получите текст заголовка / баннера.

Другой пример - программа, которую я написал некоторое время назад на Паскале (я думаю, что последняя компиляция была во FreePascal). Текст справки вообще не перенаправляется. Я видел, как это происходит с другими программами, такими как MKISOFS. Он имеет длинный текст справки, но его нельзя приостановить, отправив его через БОЛЬШЕ или перенаправив в файл!

Я размышлял об этом много лет. Раньше я думал, что это может быть потому, что текст пишется прямо на экран (например, порт B800) или что-то, но я еще не выяснил причину, не говоря уже о том, чтобы найти программу, которая может выполнить эту работу.

5

7 ответов на вопрос

2
Frank Szczerba

Взгляните на Cygwin, он дает вам доступ ко всем этим замечательным инструментам командной строки UNIX в Windows.

Спасибо, но это та же проблема, что я объяснил в комментарии к ответу Акфа. Synetech 14 лет назад 0
2
Synetech

Хорошо, как обычно, я взял на себя задачу написать программу. Сегодня вечером у меня было немного свободного времени, и я собрал собственную (то есть, не Cygwin) тестовую программу, которая работает именно так, как я надеялся, хотя и с двумя ограничениями. (У меня нет постоянно включенного хоста, но я позабочусь о том, чтобы очистить программу, написать документы и выпустить ее.)

  1. Он не может захватывать выходные данные программ, которые пишут напрямую на видеооборудование (или виртуализированное оборудование в зависимости от обстоятельств), поэтому упомянутая мной программа Pascal не может быть захвачена, пока я не перекомпилирую ее без установленного прямого флага - что случайно стало ненужным, когда я перекомпилировал это с FreePascal.

  2. Он не может получить вход от stderr . Например, если вы выполните cl /? | script.exe c:\test.log, в файл будет отправлен только текст справки компилятора Microsoft; баннер будет отображаться только на экране. (Это несколько сбивает с толку из-за того, как работает программа, поэтому я собираюсь разобраться в этом.)

С проблемой (1) мало что можно сделать (я бы не удивился, если бы где-нибудь был какой-нибудь умный человек, который мог бы найти способ перехватить прямую запись на экране, но для всех намерений и целей это, вероятно, маловероятно.)

Проблему (2) можно обойти, перенаправив stderr в stdout перед тем, как передать его следующим образом. Это не красиво (или не так удобно, но работает).

cl /? 2>&1| script.exe c:\test.log 

Это может / должно также быть работоспособным со стороны программы, тем самым упрощая конвейер, но мне еще предстоит найти какую-либо информацию о том, как (по крайней мере, «обычным / официальным» способом, например через C ++). У меня есть идея установить обработчик прерываний в таблицу векторов прерываний для перехвата вызовов общих функций API-интерфейсов вывода, которые могут / вероятно будут работать. Фактически, в 1998 году я написал экспериментальный DOS TSR (который также работает в Windows NTVDM), который перехватывает выходные функции и окрашивает их (то есть, общую синтаксическую раскраску) перед отправкой их на экран. Было бы / должно быть легко адаптировать его для отправки копии в файл.

enter image description here

(Технически это на самом деле порт `tee`, а не` script`, но это придется делать.) Synetech 10 лет назад 0
Если вы попытаетесь перехватить прямую запись на экран, у вас обязательно возникнут проблемы с совместимостью. Лучшим подходом может быть использование TSR, который может читать содержимое экрана. Бьюсь об заклад, работают программы захвата экрана. Захватывайте информацию после того, как она написана, а не до того, как она написана, и у вас, вероятно, будет меньше проблем с совместимостью. 20CC доступен? Я нахожу серый фон отвратительным, но концепция интригует. Если он настраиваемый (должен любить исходный код), я был бы достаточно заинтересован, чтобы поймать копию. Сделал быстрый поиск в интернете и пока не нашел. TOOGAM 9 лет назад 0
Глядя на этот экран снова, он выглядит супер глючит. :( «Наибольший доступный верхний объем памяти» и «0 байтов, доступных непрерывно расширенной m». И сколько байтов используется «резидентом MS-DOS в области высокой памяти?» Похоже, некоторые дефисы были перемещены. Это произошло дважды, в обоих случаях они должны быть под словами «Размер в шестнадцатеричном формате», но похоже, что они перезаписали еще больше информации. TOOGAM 9 лет назад 0
Вы использовали его некоторое время и работает ли он надежно (никаких серьезных ошибок, которые не были устранены из-за нехватки времени / интереса)? Не могли бы вы отредактировать свой ответ, предоставив ссылку на исходный код программы, если он у вас еще есть? Я ищу то же самое (порт `тройник`). Agi Hammerthief 8 лет назад 0
1
akf

К сожалению, кажется, что вам не повезет найти готовое решение Microsoft. Вы можете проверить аналогичный пост на StackOverflow. Дайджест:

Я попробовал их. К сожалению, они не работают лучше, чем стандартное перенаправление. Например, компилятор MS C ++ CL.exe. Если вы запускаете cl /?и запускаете его через <или> или | или TEE или что-то еще, тогда вы получите только вывод из опций, а не текст заголовка. Synetech 14 лет назад 1
Вы, вероятно, не получаете текст заголовка, потому что он отправляется STDERR. Вам придется перенаправить как STDOUT (>), так и STDERR (2>). Ludwig Weinzierl 14 лет назад 6
К вашему сведению, именно так вы перенаправляете STDERR и STDOUT для cl.exe: cl /? > output.log 2> & 1 Leftium 14 лет назад 3
Ни одно из этих перенаправлений не работает (как есть), потому что они уничтожили бы файл `exe` (я не спрашиваю о перенаправлении в файл; я спрашиваю о команде **` script` **). Вам нужно использовать `2> & 1 |` для * pipe * вместо этого. Synetech 12 лет назад 1
1
Leftium

Я нашел порт Cygwin для команды сценария Unix . Он захватывает как STDOUT, так и STDERR (поэтому он получает выходные данные заголовка из cl.exe).

Однако захват команд cmd.exe немного запутан по двум причинам:

  • Сценарий порождает оболочку Cygwin Bash (не cmd.exe)
  • скрипт не работает при запуске из оболочки cmd.exe; это должно быть начато с Cygwin.

Вы можете сделать это, хотя:

  1. откройте оболочку cygwin.
  2. стартовый скрипт
  3. запустить оболочку cmd.exe из оболочки cygwin
  4. делай свои вещи в cmd.exe
  5. выход из cmd.exe
  6. выйти из сценария

* также оболочка cmd.exe, порожденная изнутри cygwin, действует немного странно, но команды, кажется, работают:

  • окно, которое обычно появляется, если вы пытаетесь запустить cl.exe без первого запуска vcvars32.bat, не появляется
  • ввод с консоли очень привередливый (например, ввод LEFT RIGHTcl или UPcl не работает.)
Спасибо ** Wonsungi **. В конце концов мне удалось запустить утилиту script.exe из Cygwin, но у меня все та же проблема. Мне удалось получить обе части вывода * CL * для перенаправления в файл с помощью script.exe или синтаксиса перенаправления, который вы перечислили выше. К сожалению, все еще есть программы, которые выводят текст на экран, но они все еще не перенаправляются ни одним из них. Одной из таких программ является приложение Pascal, которое я написал некоторое время назад (оно печатается с использованием стандартного * writeln *). Текущий был скомпилирован с использованием Free Pascal или Turbo Pascal; Я должен проверить и попробовать оба. Synetech 14 лет назад 0
1
Leftium

В этом разделе часто задаваемых вопросов по General Pascal объясняется причина, а также решение для программ Turbo Pascal.

В. Когда я перенаправляю вывод своих программ на экран в файл, файл становится пустым, а вывод все еще отображается на экране. Что я делаю неправильно?

О. Вы, вероятно, используете модуль CRT, и его стандартный метод записи в стандартный вывод - прямая запись на экран. Чтобы разрешить перенаправление вывода, все записи должны выполняться DOS. Установка переменной DirectVideo в значение false не влияет на перенаправление, так как все, что она делает, это использует BIOS для записи на экран, а не DOS.

Чтобы включить перенаправление, вы не должны использовать блок CRT

ИЛИ ЖЕ

assign(output,''); rewrite(output); 

Это заставит весь вывод пройти через DOS и, таким образом, может быть перенаправлен при желании. Чтобы восстановить ситуацию по умолчанию:

AssignCRT(output); rewrite(output); 
Спасибо за ссылку на FAQ. Я проверил свои источники, и кажется, что вы правы. Версия программы, которую я использую, была скомпилирована обратно, когда у меня был включен модуль CRT, поэтому она не перенаправляет. Текущая версия не включает модуль CRT (фактически он закомментирован, по-видимому, потому что я обнаружил, что это было причиной проблемы redir раньше, но забыл). Я скомпилировал и протестировал последнюю версию, и она правильно перенаправляет. Что касается других приложений, таких как CL, кажется, вы оба были правы, он переходит на STDERR, поэтому теперь я могу использовать команду SCRIPT.exe, как и ожидалось. Благодарю. Synetech 14 лет назад 0
1
Yazad Khambata

Многие альтернативы CMD облегчают жизнь на многих направлениях, в том числе решают проблему, указанную вами в отсутствующей команде сценария. Я использовал PowerCMD, и он перенаправляет вывод в папку журнала по умолчанию. Таким образом, как конечный пользователь, вы будете видеть команды при вводе, а также ошибки и вывод команд, в то время как вся ваша работа «записывается» в файл журнала.

Чтобы настроить его в PowerCMD, зайдите в File -> Preference -> Auto Save.

Фрагмент из файла журнала, который автоматически заполняется, когда я работаю над PowerCMD,

c:\Software\Microsoft\SysinternalsSuite>date The current date is: Fri 02/13/2015  Enter the new date: (mm-dd-yy)  c:\Software\Microsoft\SysinternalsSuite>someBadCommand 'someBadCommand' is not recognized as an internal or external command, operable program or batch file. 
0
JdeBP

Это действительно два вопроса в одном, один для DOS и один для Windows, хотя ответ для обоих одинаков.

Это просто невозможно для такой программы существовать.

Существует два основных варианта для scriptUnices и для Linux. Один (такой как эта версия Linux ) использует каналы, другой (такой как эта версия HP / UX ) использует псевдотерминалы, чтобы избежать проблем с программами TUI, которые представляют «полноэкранные» интерфейсы, которые есть у конвейерного подхода. Windows NT просто не имеет псевдо-терминального механизма. В Windows NT просто невозможно захватить ввод-вывод в консоль и из консоли, как это происходит с псевдо-терминалами в системах POSIX. Можно использовать подход трубы, но ...

  • ... DOS не имеет трубного механизма. (Не смущайтесь тем, что вы можете делать в интерпретаторах команд DOS. Это не каналы.)
  • ... в Windows NT он будет страдать от проблем - почти таких же, как и для конвейерного подхода в Unices и Linux - что ...
    • … Некоторые программы распознают, что их стандартный вывод не является консолью, и действуют иначе.
    • … Другие программы, которые обрабатывают канал как консоль, потерпят неудачу, потому что устройства канала не поддерживают системные вызовы консоли.

Cygwin полагается на сотрудничество целевых программ под общим предлогом.

Вам может быть интересно узнать о команде Cygwin scriptи ее не совсем правильном поведении с программами не-Cygwin.

Cygwin пытается эмулировать псевдо-терминалы, используя каналы Windows NT. Он основан на том факте, что каждая программа Cygwin использует библиотеку времени выполнения Cygwin, которая «знает», когда канал «действительно» является псевдо-терминалом, использует информацию, закрытую для библиотеки времени выполнения Cygwin, и действует соответствующим образом. Функция библиотеки времени выполнения isatty()говорит «да», когда среда выполнения видит канал, который «действительно» является псевдо-терминалом Cygwin. Таким образом, программы Cygwin, запущенные Cygwin's, scriptбудут действовать так, как если бы они были подключены к (псевдо) терминалам.

Конечно, не-Cygwin программы, которые не участвуют в этом коллективном заблуждении, будут просто видеть каналы такими, какие они есть, как каналы, и вести себя так, как они, когда их стандартные входы / выходы / ошибки - это каналы.

Cygwin - это шаг в правильном направлении, но есть другие сторонние командные строки, которые могут обеспечить необходимую функциональность. В конце концов, это просто вопрос отправки вывода как в файл, так и на экран. Поскольку сторонняя командная строка отвечает за рисование экрана, она получает входные данные и может просто отправить копию в файл. Проблема в том, что это нелегко сделать с помощью командной строки по умолчанию в Windows. Что касается DOS, он может работать, если программа использует функции печати по умолчанию (например, DOS INT 2F), а не запись непосредственно на экран. Synetech 12 лет назад 0
Киддо, [командная строка не является программой] (http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/a-cli-is-not-a-dos-prompt.html). Команда _interpreter_ - это программа, и она не «рисует экран» для других программ] (http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/a-command-interpreter-is-not- a-console.html) или действительно обрабатывать свои операции ввода-вывода любым способом. Ваша идея, что это возможно, основана на довольно ошибочном представлении о том, что делает в Windows. И вы живете в 1986 году в отношении DOS. Это то, что люди говорили тогда, и этого не произошло. JdeBP 12 лет назад 0
Я пытался спорить об этом. Когда у меня будет время, я просто сам напишу `script.exe`; У меня уже есть не менее двух методов для использования. Synetech 12 лет назад 0

Похожие вопросы