Я хочу знать, почему в командной строке это происходит.

У меня есть скрипт fileX.cmd который представляет собой одну строку текста:

@echo dir

Если я сделаю

C:\Users\Dogfood>fileX.cmd | cmd

Это покажет все файлы в каталоге, но ...

C:\Users\Dogfood>type fileX.cmd | cmd

не. Командная строка открывает новый cmd, но спрашивает меня « More?"

Почему содержимое файла x.cmd передается в cmd справа от канала так же, как в первой строке? (т.е. fileX.cmd | cmd)

2 ответа2

0

Труба в CMD | cmd выполнит любые команды в своем входном потоке.

  • В первом случае входной поток будет содержать выходной fileX.cmd , а именно dir , и это то, что | cmd выполнится.
  • во втором случае входной поток будет содержать @echo dir , поэтому вы должны увидеть только текст dir .

Я получаю More? если в конце команды в fileX.cmd нет новой строки в конце команды. Причина разницы заключается в том, что первичная оболочка при завершении EOF примет команду как завершенную, тогда как cmd в конце канала ожидает завершенные строки. Если вы хотите объяснить, почему это так, вам придется обратиться в Microsoft.

(Кстати, ваше описание относится к fileX X , а не к файлу fileX.cmd , и вы говорите, что он содержит одну строку, хотя я подозреваю, что он содержит неполную строку.)

-1

Вы должны помнить, что конвейер принимает выходные данные первой части команды и передает их следующей команде.

Давайте возьмем fileX.cmd | cmd и разбить его:

filex.cmd = @echo dir

Если мы введем @echo dir из командной строки, мы увидим вывод как dir . Echo просто выводит то, что приходит после команды echo. Вывод не выполняется, только отображается.

набрав filex.cmd из командной строки и Нажатие Enter дает нам выход dir Это ничем не отличается от предыдущего оператора, просто команда находится в файле batch/cmd.

Если мы добавим | cmd , то результаты, которые мы видим, отличаются, мы получаем список каталогов. Зачем? Поскольку выходной файл filex.cmd имеет значение dir и мы передаем dir в командную строку, которая принимает эти выходные данные и выполняет их, предоставляя нам список каталогов.

Так почему же вторая команда не делает то же самое? Причина в том, что вы используете команду type . Type отображает текст на экране. Если ваш список каталогов короткий, он бы сработал. Однако ваш список каталогов прокручивается за пределы экрана, поэтому команда type приостанавливает вывод и спрашивает, хотите ли вы more? , Этот вопрос more? Теперь вывод и передача в командную строку.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .