Трубопровод не работает с компакт-диском | проводник в cmd - PullRequest
0 голосов
/ 07 мая 2020

Я изучал пакетные сценарии, поэтому я столкнулся с конвейерами и перенаправлением ввода-вывода.

Если это работает:

tasklist | find "winword"

Почему это не так:

cd | explorer

Я ожидаю, что эта команда откроет проводник в текущем рабочем каталоге, поскольку cd без каких-либо параметров выводит текущий каталог и:

explorer %directory%

открывает проводник в %directory%.

Is что-то я здесь делаю не так?

1 Ответ

0 голосов
/ 27 мая 2020

Откройте окно командной строки, введите find "blah" и нажмите Введите ; вы увидите, что он ожидает ввода пользователя / клавиатуры / консоли, на который указывает STDIN (нажмите Ctrl + Z и Enter , чтобы завершить запрос). Затем наберите echo blah и нажмите Введите ; вы заметите, что напечатан текст blah, поэтому есть вывод на дисплей / консоль; на это указывает STDOUT . Канал | берет данные в STDOUT из левой команды и перенаправляет их в STDIN для правой команды.

Теперь введите explorer в окно командной строки; Конечно, появляется окно проводника, но что происходит в командной строке? правильно, ничего, он не ожидает ввода в STDIN . Таким образом, вы можете подключиться к нему, но ему все равно, поскольку он не читает в STDIN . Фактически, приложения GUI обычно не используют STDIN и STDOUT , потому что эти вещи предназначены для приложений командной строки.

Еще один пример: в команде Окно подсказки, введите echo C:\Windows; совершенно очевидно, что произойдет; затем введите echo C:\Windows| dir; что случается? dir возвращает содержимое текущего каталога, но не C:\Windows. Зачем? Что ж, давайте сначала наберем dir и посмотрим, что произойдет: да, dir показывает содержимое текущего каталога, а не ожидает ввода консоли; поэтому с правой стороны канала он получает данные по адресу STDIN , но ему просто все равно. Вы можете попробовать использовать dir "C:\some\other\folder", без и с конвейером, вывод будет таким же, STDIN здесь игнорируется.

Пример echo / dir также демонстрирует разница между консольным вводом ( STDIN ) и аргументами или параметрами командной строки: таким аргументом является путь в командной строке dir "C:\some\other\folder", и вы не можете заменить его данными из STDIN . Чтобы понять, почему, вам нужно различать guish между время анализа (когда команда считывается и анализируется интерпретатором) и время выполнения (когда команда фактически выполнено): аргументы уже должны присутствовать во время синтаксического анализа, в то время как STDIN актуален только во время времени выполнения , что позже. Таким образом, мы можем сказать, что они просто никогда не встречаются.

Это также отражает ситуацию с вашей попыткой cd | explorer: последний принимает аргументы командной строки (которые в любом случае должны быть доступны перед выполнением , поэтому во время синтаксического анализа), но его не волнует STDIN . Также данные STDOUT из cd недоступны перед выполнением (но только во время выполнения), поэтому в любом случае они будут доставлены слишком поздно ...

...