Chcę uzyskać wynik polecenia jako zmienną w skrypcie wsadowym systemu Windows (zobacz, jak uzyskać wynik polecenia w bash dla odpowiednika skryptu bash). Preferowane jest rozwiązanie, które będzie działać w pliku .bat, ale mile widziane są również inne popularne rozwiązania skryptowe dla systemu Windows.
windows
scripting
batch-file
John Meagher
źródło
źródło
Odpowiedzi:
Jeśli musisz przechwycić wszystkie dane wyjściowe polecenia, możesz użyć takiej partii:
Wszystkie wiersze wyjściowe są przechowywane w VAR oddzielone znakiem „!”.
@John: czy ma to jakieś praktyczne zastosowanie? Myślę, że powinieneś obejrzeć PowerShell lub inny język programowania zdolny do łatwego wykonywania zadań skryptowych (Python, Perl, PHP, Ruby)
źródło
cmd
, abym mógł go tam uruchomić. ... Tak, to jest tak straszne jak dźwięki. Visual Studio czasami sprawia, że mam ochotę płakać. @ Ajedi32 Myślę, że chciałeś powiedzieć, że skrypty wsadowe są okropnym reliktem przeszłości. ;)Pokora do dowodzenia zgromadziła przez lata kilka interesujących zdolności:
Zauważ, że
"delims="
nadpisuje domyślną spację i ograniczniki tabulacji, tak że dane wyjściowe polecenia date zostaną pożarte od razu.Aby uchwycić wyjście wieloliniowe, nadal może to być zasadniczo jednowierszowy (używając zmiennej lf jako separatora w wynikowej zmiennej):
Aby uchwycić wyrażenie potokowe, użyj
^|
:źródło
FOR /F "delims=" %%i IN ('date /t') DO set today=%%i
for
polecenie bezpośrednio w wierszu poleceń, użyjesz pojedynczego%
. Jeśli używasz go w pliku wsadowym, używasz%%
.%
for /f "delims=" %%i in ('date +%F_%H-%M-%S') do set now=%%i
date
użyte polecenie pochodzi z Cygwin. Zgadzam się, że powinienem o tym wspomnieć.Aby uzyskać bieżący katalog, możesz użyć tego:
Używa jednak pliku tymczasowego, więc nie jest najpiękniejszy, ale z pewnością działa! „CD” umieszcza bieżący katalog w „tmpFile”, „SET” ładuje zawartość tmpFile.
Oto rozwiązanie dla wielu wierszy z „tablicami”:
Ale możesz rozważyć przejście na inną, mocniejszą powłokę lub stworzenie aplikacji do tych rzeczy. To znacznie rozszerza możliwości plików wsadowych.
źródło
musisz użyć
SET
polecenia z parametrem/P
i skierować do niego swoje wyjście. Na przykład zobacz http://www.ss64.com/nt/set.html . Będzie działać dla CMD, nie jestem pewien co do plików .BATZ komentarza do tego posta:
źródło
Przykład ustawienia w zmiennej środowiskowej „V” najnowszego pliku
w pliku wsadowym należy użyć podwójnego przedrostka w zmiennej pętli:
źródło
Po prostu użyj wyniku z
FOR
polecenia. Na przykład (w pliku wsadowym):Możesz użyć
%%I
jako żądanej wartości. Podobnie jak ten:%%I
.Z góry
%%I
nie ma spacji ani znaków CR i może być używany do porównań !!źródło
Chciałbym dodać uwagę do powyższych rozwiązań:
Wszystkie te składnie działają doskonale, JEŻELI POLECENIE ZNAJDUJE SIĘ W ŚCIEŻCE lub JEŻELI POLECENIE JEST ŚCIEŻKĄ CMD BEZ SPACJI I ZNAKÓW SPECJALNYCH.
Ale jeśli spróbujesz użyć wykonywalnego polecenia znajdującego się w folderze, którego ścieżka zawiera znaki specjalne, musisz ująć ścieżkę polecenia w podwójne cudzysłowy ("), a składnia FOR / F nie będzie działać.
Przykłady:
lub
lub
W takim przypadku jedynym rozwiązaniem, które znalazłem, aby użyć polecenia i zapisać jego wynik w zmiennej, jest ustawienie (tymczasowo) domyślnego katalogu na katalog samego polecenia:
Wynik jest wtedy poprawny:
Oczywiście w powyższym przykładzie zakładam, że mój skrypt wsadowy znajduje się w tym samym folderze co jedno z moich poleceń wykonywalnych, więc mogę użyć składni „% ~ d0% ~ p0”. Jeśli tak nie jest, musisz znaleźć sposób na zlokalizowanie ścieżki poleceń i zmienić domyślny katalog na jego ścieżkę.
NB: Dla tych, którzy się zastanawiają, przykładowe polecenie użyte tutaj (do wybrania folderu) to FOLDERBROWSE.EXE. Znalazłem go na stronie internetowej f2ko.de ( http://f2ko.de/en/cmd.php ).
Jeśli ktoś ma lepsze rozwiązanie dla tego rodzaju poleceń dostępnych poprzez złożoną ścieżkę, z przyjemnością o tym usłyszę.
Gilles
źródło
CALL
. FOR / F nie działa, jeśli ścieżka zawiera spacjeCALL "%SOURCEDIR%\FOLDERBROWSE" ... "quoted parameters"
> działa doskonale.Jeśli szukasz rozwiązania podanego w artykule Używanie wyniku polecenia jako argumentu w bash?
to tutaj jest kod:
[Podziękowania] : Dzięki wszystkim pozostałym odpowiedziom i odrobinie informacji na stronie poleceń systemu Windows XP .
źródło
źródło
Możesz przechwycić wszystkie dane wyjściowe w jednej zmiennej, ale wiersze będą oddzielone wybranym przez Ciebie znakiem (# w poniższym przykładzie) zamiast rzeczywistego CR-LF.
Druga wersja, jeśli chcesz wydrukować zawartość wiersz po wierszu. Wykorzystuje to fakt, że nie będzie zduplikowanych wierszy wyjścia z "dir / b", więc może nie działać w ogólnym przypadku.
źródło
wynik to „TXT: hola”
źródło
Powinieneś użyć
for
polecenia, oto przykład:i możesz użyć
call :output "Command goes here"
wtedy wyjście będzie w%output%
zmiennej.Uwaga: Jeśli masz wyjście polecenia, które jest wielowierszowe, to narzędzie
set
wyświetli wynik do ostatniego wiersza polecenia wielowierszowego.źródło
Zapoznaj się z tym http://technet.microsoft.com/en-us/library/bb490982.aspx, który wyjaśnia, co można zrobić z danymi wyjściowymi polecenia.
źródło
git pull>0 set /P RESULTVAR=<0
edytuj: wydaje mi się, że nie wiem, jak tutaj używać znaków końca linii ... każde polecenie znajduje się w osobnym wierszu.