Ustaw wartość zmiennej z wynikiem polecenia w pliku wsadowym systemu Windows


99

Podczas pracy w środowisku Bash , aby ustawić wartość zmiennej jako wynik polecenia, zwykle robię:

var=$(command -args)

gdzie varjest zmienną ustawioną przez polecenie command -args. Mogę wtedy uzyskać dostęp do tej zmiennej jako $var.

Bardziej konwencjonalnym sposobem na to, który jest kompatybilny z prawie każdą powłoką Uniksa, jest:

set var=`command -args`

To powiedziawszy, w jaki sposób mogę ustawić wartość zmiennej z wynikiem polecenia w pliku wsadowym systemu Windows ? Próbowałem:

set var=command -args

Ale uważam, że varjest to ustawione command -argsraczej niż wyjście polecenia.

Odpowiedzi:


63

Aby zrobić to, co opisuje Jesse , z pliku wsadowego systemu Windows musisz napisać:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

Ale zamiast tego sugeruję użycie Cygwin w systemie Windows, jeśli jesteś przyzwyczajony do skryptów typu Unix.


19
użyj for /f "delims=" %a in ('ver') do @set foobar=%aw wierszu polecenia. użyj for /f "delims=" %%a in ('ver') do @set foobar=%%aw plikach skryptów
georg

Lekką alternatywą jest Gnu w systemie Windows ( github.com/bmatzelle/gow/wiki ). Po prostu otwórz wiersz polecenia i uruchom bash. Następnie możesz pisać polecenia bash. Możesz także wykonywać skrypty bash.
Nathan,

4
Zauważ, że jeśli twoje polecenie zawiera potok, musisz go zmienić za pomocą daszka, na przykład: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ ustaw foobar = %% a
yoyo

35

Należy być nieco ostrożnym, ponieważ polecenie wsadowe systemu Windows:

for /f "delims=" %%a in ('command') do @set theValue=%%a

nie ma tej samej semantyki co instrukcja powłoki Unix:

theValue=`command`

Rozważ przypadek, w którym polecenie nie powiedzie się, powodując błąd.

W wersji powłoki Unix nadal występuje przypisanie do „theValue”, a każda poprzednia wartość jest zastępowana wartością pustą.

W wersji wsadowej systemu Windows jest to polecenie „for”, które obsługuje błąd, a klauzula „do” nigdy nie jest osiągnięta - więc każda poprzednia wartość „theValue” zostanie zachowana.

Aby uzyskać więcej semantyki uniksowej w skrypcie wsadowym systemu Windows, musisz upewnić się, że przypisanie ma miejsce:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

Niepowodzenie wyczyszczenia wartości zmiennej podczas konwersji skryptu systemu Unix do partii systemu Windows może być przyczyną drobnych błędów.


2
Dziękuję za wyjaśnienie subtelnej różnicy między Windows a * nix.
Jeroen Wiert Pluimers

3
Pamiętaj też o unikaniu znaków specjalnych w command; np for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a. : .
Bill_Stewart

@Bill_Stewart właśnie uratowałeś mi dzień, przez chwilę myślałem, że znacznie trudniej jest przypisać wyjście poleceń
potokowych

19

Oto jak to zrobić, gdy potrzebuję wyników zapytania do bazy danych w moim pliku wsadowym:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

Klucz znajduje się w linii 2: „set / p” ustawia wartość „result” na wartość pierwszego wiersza (tylko) w „__query.tmp” za pośrednictwem operatora przekierowania „<”.


14

Jedynym sposobem, w jaki widziałem, jak to się robi, jest zrobienie tego:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver to polecenie wersji dla systemu Windows, które w moim systemie generuje:

Microsoft Windows [Version 6.0.6001]

Źródło


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.