Partia odpowiedników grawisów Bash

97

Podczas pracy z Bash'em mogę umieścić wynik jednego polecenia w innym poleceniu:

my_command `echo Test`

byłoby to samo co

my_command Test

(Oczywiście jest to tylko niepraktyczny przykład).

Zastanawiam się tylko, czy możesz zrobić to samo w usłudze Batch.

MiffTheFox
źródło

Odpowiedzi:

53

Możesz to zrobić, przekierowując najpierw dane wyjściowe do pliku. Na przykład:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
zvrba
źródło
16
Wymaga to znalezienia miejsca, w którym masz uprawnienia do zapisu, aby zapisać plik tymczasowy; musisz po sobie posprzątać; ten przykład umożliwia odczytanie tylko pierwszej linii danych wejściowych. Ze względów praktycznych for /fwariant jest znacznie lepszy.
Joey
@grawity - wraz z%random%
bacar
1
@joey Czyta każdą linię, ale jak połączyć z argumentem wiersza poleceń w pojedynczym poleceniu.
user877329
jak obsługuje znaki nowej linii?
andrewrk
103

Możesz uzyskać podobną funkcjonalność za pomocą skryptów cmd.exe za pomocą for /fpolecenia:

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

Tak, to trochę nieoczywiste (delikatnie mówiąc), ale tak jest.

Zobacz for /?krwawe szczegóły.

Na marginesie: Pomyślałem, że użycie znaku „ echo” wewnątrz grawisów w for /fpoleceniu „ ” będzie musiało być wykonane przy użyciu polecenia „ cmd.exe /c echo Test”, ponieważ echojest to polecenie wewnętrzne cmd.exe, ale działa w bardziej naturalny sposób. Skrypty wsadowe Windows zawsze jakoś mnie zaskakują (ale zwykle nie w dobry sposób).

Michael Burr
źródło
2
Zwykle musisz to zrobić podczas wykonywania poleceń wbudowanych powłoki z programów zewnętrznych, które nie tworzą automatycznie powłoki. To system()znaczy, C było w porządku, iirc, ponieważ uruchamia powłokę w każdym przypadku, ale .NET Process.Startmusi jawnie wywołać powłokę. Coś w tym stylu, iirc. W każdym razie uważam, że to lepsza odpowiedź niż zaakceptowana :-)
Joey
2
Opcje, aby fornie zaszkodzić, ale zmylić problem. A co z tym:for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas
9
Użyj pojedynczego% zamiast %% podczas wykonywania tego samego w wierszu poleceń, a nie w skrypcie wsadowym.
jsears
2
Wydaje się, że nie działa dobrze z rurociągami, na przykład operator „>”. Ale poza tym to jest niesamowite. Chyba że był to tylko problem% vs %%, który miałem.
Jonathan
3
@Evan: tokens=*jest ważny. W przeciwnym razie, jeśli wynik polecenia zawiera spacje, wyprowadzane jest tylko pierwsze słowo. Uruchomić to w wierszu: for /f %a in ('"echo foo bar"') do echo "%a". To się wydrukuje "foo".
Dan Dascalescu
29

Przeczytaj dokumentację polecenia „for”: for /?

Niestety nie jestem zalogowany do systemu Windows, aby samemu to sprawdzić, ale myślę, że coś takiego może przybliżyć to, czego chcesz:

for /F %i in ('echo Test') do my_command %i
Weeble
źródło
6
W przypadku, gdyby ktoś inny się na tym natknął, gdy polecenie jest wykonywane z pliku wsadowego (* .bat), obie zmienne% i muszą mieć podwójny znak procentu: %% i.
mgouin
3

Zawsze możesz uruchomić Bash w systemie Windows. Robię to cały czas z MSYS (dużo wydajniejszy niż Cygwin ).

davr
źródło
Niestety MSYS jest obecnie ledwo utrzymywany, aby uzyskać aktualny bash, musisz go zainstalować osobno
Ed Randall
1
BusyBox jest jeszcze mniejszy (~ 432 KB). Nie jest to jednak pełny Bash, tylko Ash. Pobierz nieoficjalny port Windows tutaj: frippery.org/busybox
Martin,
3

Może psuję składnię for /fmetody standardowej , ale kiedy umieszczam bardzo złożone polecenie obejmujące && i | w obrębie kresek w granicy for /f, powoduje to problemy. Możliwa jest niewielka modyfikacja w stosunku do zwykłego, aby obsłużyć dowolne polecenie złożoności:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

Umieszczając najpierw pełne i złożone polecenie w zmiennej, a następnie umieszczając odwołanie do zmiennej w limicie, zamiast umieszczać złożone polecenie bezpośrednio w granicy pętli for, można uniknąć problemów z interpretacją składni. Obecnie, jeśli skopiuję dokładne polecenie, które ustawiłem dla VVzmiennej w powyższym przykładzie, do miejsca, w którym jest używane, %VV%powoduje to błędy składniowe.

mtalexan
źródło
1
To nie zadziałało dla mnie, ale odkryłem, że możesz wykonać potokowanie bezpośrednio w poleceniu for, jeśli uciekniesz go za pomocą karata (^): for / f "usebackq tokens = *" %% a in (`command ^ | command`) wykonaj polecenie %% a
Heptite
Ucieczka @Heptite Card nie działała, ale otaczanie wiersza poleceń podwójnymi cudzysłowami działało.
Alexandr Zarubkin
@Heptite W moim przypadku nie znałem serii poleceń, które będę musiał wykonać wcześniej, zostały one wyodrębnione z pliku w jednym przypadku i przekazane w innym. W przypadku ucieczki musisz wiedzieć, ile razy uciec przed poleceniem, w zależności od tego, przez ilu tłumaczy ma przejść, aw moich przypadkach użycia nie była to stała liczba tłumaczy.
mtalexan