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.

Francis
źródło

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.

nik
źródło
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.

Jonathan Headland
źródło
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 „<”.

dużo czasu
źródło
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

Jesse Dearing
źródło
0
Set "dateTime="
For /F %%A In ('powershell get-date -format "{yyyyMMdd_HHmm}"') Do Set "dateTime=%%A"
echo %dateTime%
pause

wprowadź opis obrazu tutaj Oficjalne dokumenty Microsoft dotyczące forpolecenia

alchi baucha
źródło