2009-09-15 10 views
5

Jak mogę w systemie Windows użyć wyjścia skryptu/komendy jako argumentu dla innego skryptu? (Rura | nie będzie działać tutaj, ponieważ ten drugi scenariusz nie czyta ze standardowego wejścia)Przekierowywanie wyjścia do argumentu wiersza polecenia innego polecenia w systemie Windows

Zbyt wyjaśnienie: Mam AnotherScript że potrzebuje argument arg, np

AnotherScript 12 

teraz chce argumentu (12 w przykładzie) pochodzić z wyjścia skryptu, nazwij go ScriptB. Więc chciałbym coś wzdłuż linii

AnotherScript (ScriptB) 

AnotherScript faktycznie jest skrypt Pythona, który wymaga argumentu, a ScriptB jest skrypt Cygwin bash, które wytwarza pewną liczbę, więc droga chciałbym wykorzystać to coś takiego:

c:\Python26\python.exe AnotherScript (c:\cygwin|bin|bash --login -i ./ScriptB) 

Dzięki za odpowiedzi. Jednakże, biorąc pod uwagę żmudny konstrukt "for", przepisałem inny kod, aby odczytać go ze standardowego wejścia. To wydaje się lepszym rozwiązaniem.

+0

Pomoże nam, jeśli powiesz nam, co robi "inny skrypt" *, od tego czasu, jeśli nie standardowe wejście. – Amber

Odpowiedz

8

Uwaga: Wszystko to wymaga polecenia być w pliku wsadowym. Stąd podwójne znaki %.

Można użyć komendy for uchwycić wyjście komendy:

for /f "usebackq delims=" %%x in (`ScriptB`) do set args=%%x 

następnie można użyć tego wyjścia w innej komendy:

AnotherScript %args% 

Spowoduje %args% zawierać ostatni z linii wyjściowej z ScriptB. Jeśli tylko zwraca jeden wiersz można toczyć to w jednym wierszu:

for /f "usebackq delims=" %%x in (`ScriptB`) do AnotherScript %%x 

Przy stosowaniu na zewnątrz pliku wsadowego trzeba użyć %x zamiast %%x.

Jeśli jednak ScriptB zwróci więcej niż jedną linię, dla każdej z tych linii zostanie uruchomiony kod AnotherScript. Można obejść ten, choć tylko w pliku Batch-łamiąc po pierwszej iteracji:

for /f "usebackq delims=" %%x in (`ScriptB`) do AnotherScript %%x & goto :eof 
+0

Już miałem opublikować tę samą odpowiedź. Pokonałeś mnie! :) – Paulius

+0

Powinienem pracować, a nie spędzać czas na SO :-) – Joey

+0

Aby korzystać z plików bez użycia partii, a jeśli chcesz, aby drugi skrypt działał w każdym wierszu, następujące utwory 'cmd/v: on' then 'for/f" delims = "% x in ('findstr string files_eg * .csv') do (ustaw y =% x & zestaw z =! y :: = ,! i echo! z!) >> results.txt '(czy podstawienie dwukropków przecinkami) – mpag

1

Zapisz dane w pliku tymczasowym?

lub użyj nazwanego potoku zamiast rury na wejściu standardowym i wyjściowym.

lub zadzwonić pod inny skrypt z pierwszej i transfer danych poprzez argumenty poleceń

3

można zaoszczędzić wyjście pierwszego skryptu do zmiennej środowiskowej oraz wykorzystania jego treści jako parametr wiersza poleceń do drugi skrypt, jeśli tego chcesz.

coś takiego:

for /f "delims=" %a in ('first_script.cmd') do @set ouput=%a 
second_script %ouput% 
0

Czy nie czyni rzeczy o wiele bardziej skomplikowane niż to konieczne?

Zadzwoń do innego skryptu z bash. W razie potrzeby zainstaluj Cygwin, abyś mógł to zrobić.

+0

Problem polega na tym, że (Który inny) potrzebuje argumentu i że ten argument jest wartością zwracaną przez skryptB. – Rabarberski

+5

scriptB | xargs AnotherScript – reinierpost