2

В Linux это принимает одну команду и передает ее вывод (stdout) другой:

echo `ls`

Что такое Windows/ CMD / пакетный эквивалент?

2 ответа2

13

cmd.exe предлагает элементарную возможность подстановки команд с помощью обратных галочек, но только через цикл for с параметром /f usebackq . Это довольно умопомрачительно по сравнению с тем, что сделала бы оболочка Unix, так как ее стандартное поведение состоит в том, чтобы выбирать только первое слово каждой строки вывода дочернего элемента и только так, чтобы вы могли перебирать их, а не вставлять все они сразу в командной строке. (Вы можете немного изменить поведение с помощью опции delims .) Вот пример:

for /f usebackq %F in (`dir /w s*c`) do echo %F

Если вам нужна настоящая подстановка команд в стиле Unix, вам понадобится подлинная оболочка Unix, например, Cygwin bash или моя собственная (коммерческая) оболочка Hamilton C.

1

Пример вывода эха dir (используйте одинарные кавычки, а не обратный тик!):

echo off & for /f "delims=" %A in ('dir') do echo %A

В интерактивном режиме вам нужно набрать echo on и нажать Enter для выхода. Если вы уверены, что цикл запускается только один раз (т. Е. Вывод ('xxx') - это одна строка), вы можете напрямую добавить echo on в команду.

echo off & for /f "delims=" %A in ('set /a 0x3DE1') do net helpmsg %A & echo on

По неизвестной причине ('set /a 0x3DE1') не может работать как 'set /a c=0x3DE1' , даже если set /a c=0x3DE1 работает как одна команда.

Пример echo hello world из 'echo hello world' (одинарные кавычки):

echo off & for /f "delims=" %A in ('echo hello world') do echo %A

Пример echo hello world из "" (буквальная строка):

echo off & for /f "delims=" %A in ("hello world") do echo %A

Выше синтаксиса %A для интерактивного режима, вам нужно двойной % в пакетном файле, например %%A

Позаботьтесь , если вы делаете echo %A внутри цикла, представьте себе , если один из строки из вывода команды призвал, то есть 2 проблемы:

[1] echo $A означает echo on котором эхо ничего не будет и невидимо. Я могу думать только о сравнении on для обработки такого конкретного случая.

[2] echo $A означает echo on котором будет переключаться обратно вывод командной строки; Вам может понадобиться добавить дополнительное echo off в цикле, например:

echo off & for /f "delims=" %A in ('dir /b') do echo %A & echo off

Обратите внимание, что приведенные выше примеры далеко не эквивалентны `` поскольку они запускают аргумент построчно. Вы можете создать этот пакет, чтобы попытаться смоделировать echo `ls` (он зацикливается и добавляет все строки в одну переменную, разделенные пробелом, а затем передает их в качестве аргумента позже):

@echo off
Setlocal EnableDelayedExpansion
set fls=
for /f "delims=" %%A in ('dir /b') do set fls=!fls! %%A
echo %fls%

- изменить: добавлены пропущенные пробелы

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