Как перенаправить стандартный ввод в файл в командной строке Windows?

В Unix я бы сделал что-то вроде:

cat > file.txt

Как я могу сделать это в командной строке Windows или в пакетном файле?

EDIT: По сути, я ищу функциональность cat без аргументов (он читает со стандартного ввода и выплевывает обратно на стандартный вывод).


person Matt    schedule 30.05.2012    source источник
comment
type thisfile > output.txt помещает все выходные данные так же, как unix cat type thisfile >> output.txt добавляет все выходные данные в файл без перезаписи   -  person Kyle    schedule 31.05.2012
comment
+1 за использование type такого классного и простого решения.   -  person Dominic P    schedule 01.03.2013
comment
@DominicP, за исключением того, что это не работает для моих целей (читайте после EDIT :)   -  person Matt    schedule 07.03.2013
comment
@ Мэтт, да, это не совсем то же самое. Я не уверен, сколько вы работали с оболочкой Windows, но, по моему опыту, такое близкое приближение к функциональности * nix довольно редко / приятно. :)   -  person Dominic P    schedule 08.03.2013


Ответы (4)


TYPE CON

CON — это устройство MS-DOS для консольного ввода. Вы можете перенаправить на файл следующим образом:

TYPE CON>output.txt

Для завершения нажмите Ctrl + C или Ctrl + Z, Enter (< kbd>Ctrl + Z = EOF).

person Mark K Cowan    schedule 15.05.2013
comment
Ах, лол! Хотя, я думаю, это может быть полезно для других... Я, наверное, единственный человек моего возраста, который знает об элегантном ярлыке TYPE CON>LPT1, позволяющем превратить MS-DOS в пишущую машинку! - person Mark K Cowan; 24.07.2013
comment
Альтернативы Windows для многих команд * nix действительно существуют, но они развивались, а не были разумно спроектированы, как bash, поэтому их немного сложнее найти и часто гораздо сложнее в использовании, чем они должны быть... Отличный пример этого разница заключается в обратной кавычке bash и эквивалентной конструкции FOR в DOS. Слава небесам за Powershell и C#script! - person Mark K Cowan; 31.07.2013
comment
Ах, как я мог забыть упомянуть Cygwin на этой машине с двойной загрузкой? :D - person Mark K Cowan; 31.07.2013
comment
Кроме того, COPY CON output.txt - person Patrick McDonald; 09.06.2017
comment
-1 потому что не работает: читает не со стандартного ввода, а с консоли. ОП запросил стандартный ввод. Проверял на вин10. - person robert4; 07.08.2017
comment
В win10 вам понадобится небольшая программа на языке C, зацикливающая fgetc/fputc - person Mark K Cowan; 07.08.2017
comment
@robert4: В чем разница между стандартным вводом и консолью? - person Zimba; 05.11.2019
comment
@Zimba: см. этот вопрос или разницу между echo hello | find "hello" >first.txt и echo hello | type con >second.txt. first.txt будет содержать hello без запроса ввода, но для second.txt вам нужно что-то ввести - person robert4; 20.11.2019

Если все, что вам нужно, это читать стандартный ввод и записывать то, что вы читаете, в стандартный вывод, то FINDSTR может работать, в зависимости от того, как вы его используете.

FINDSTR будет выводить точное двоичное изображение ввода, если ввод указан как одно имя файла в конце списка аргументов.

findstr "^" file.txt

Каналы или перенаправление также могут работать, в зависимости от содержимого ввода:

findstr "^" < file.txt
or
type file.txt | findstr "^"

Выходные данные будут повреждены, если при использовании перенаправленного или конвейерного ввода с FINDSTR произойдет одно из следующих событий:

  • Любая строка ввода> 8191 байт
  • Последняя строка ввода не завершается символом \n. (команда может зависнуть при перенаправлении ввода)

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

FINDSTR также отличается от cat тем, что не может читать как из стандартного ввода, так и из именованного файла.

См. Каковы недокументированные функции и ограничения. команды Windows FINDSTR? для получения дополнительной информации.

person dbenham    schedule 30.05.2012
comment
РЕДАКТИРОВАТЬ - Исправлена ​​информация о конвейерном вводе с добавлением CR/LF. Добавлена ​​информация о XP и Windows 7, потенциально зависающих при перенаправленном вводе. - person dbenham; 29.11.2012
comment
Спасибо за этот ответ! Для всех остальных есть пакетный файл, который записывает (добавляет) стандартный ввод в файл foo.txt: findstr ^ ››foo.txt - person Robert Calhoun; 30.11.2012
comment
@dbenham - findstr "^" < %windir%\system32\calc.exe > c.exe выдает Line is too long ошибку на Win7. Не подходит для бинарного копирования? - person Egor Skriptunoff; 15.08.2018
comment
@EgorSkriptunoff - каналы и перенаправление ограничивают длину входной строки FINDSTR. Укажите входной файл в качестве аргумента (просто удалите <), а не используйте перенаправление, и это должно работать. Дополнительную информацию см. в разделе Ограничения длины строки на странице stackoverflow.com/a/8844873/1012053. - person dbenham; 15.08.2018
comment
@EgorSkriptunoff - я обновил ответ, включив ограничение длины строки. - person dbenham; 15.08.2018
comment
@dbenham - Спасибо. На самом деле, я пытаюсь найти, как я могу скопировать двоичные данные из ADS в отдельный файл, я надеялся, что сработает следующее: findstr "^" < file.txt:hidden.exe > hidden.exe. К сожалению, findstr не считает ADS допустимым именем файла: findstr "^" file.txt:hidden.exe > hidden.exe (ошибка: Can't open file "file.txt:hidden.exe"). type тоже не работает. Поэтому я должен использовать перенаправление < для доступа к ADS. Я ищу утилиту Win7, которая читает двоичный стандартный ввод и записывает его в стандартный вывод (или в выходной файл). Еще не нашел. Не могли бы вы дать подсказку? - person Egor Skriptunoff; 16.08.2018
comment
@EgorSkriptunoff - Ваша проблема заслуживает отдельного вопроса - вы должны опубликовать его. Я не знаю ни одной родной пакетной утилиты, которая будет работать. Я подозреваю, что что-то может быть написано на другом языке сценариев, особенно на powershell. Но у меня нет большого опыта работы с ADS, поэтому я не уверен. - person dbenham; 16.08.2018

Я думаю, что more.exe может быть тем, что вы ищете.

Он может принимать ввод как из консоли:

more > file1.txt

Или передается из другого файла, который TYPE CON не обрабатывает:

type file1.txt | more > file2.txt

(Кажется, more добавляет к вашему файлу новую строку и расширяет вкладки, поэтому не используйте его для двоичных данных!)

person Carl Walsh    schedule 14.01.2015
comment
На самом деле это помогло, когда у меня было несколько строк. Спасибо. - person TheGameiswar; 22.10.2017
comment
Хороший. Это единственный, который работал со стандартным вводом. Другие решения передаются только по конвейеру или из другого файла. - person nharrer; 07.04.2021

Стандартный ввод:

Пакетный файл:

:: set /p MyVar=   Prompts user for stdin information

set /p MyVar=

echo %MyVar% > filename
person JMC    schedule 30.05.2012
comment
Это должно было бы сначала прочитать весь стандартный ввод, не так ли? Кажется, что это было бы непрактично, если стандартный ввод очень большой. - person Matt; 31.05.2012