Przypisanie wyjścia programu do zmiennej
Muszę przypisać wyjście programu do zmiennej za pomocą pliku wsadowego MS.
Więc w powłoce GNU Bash użyłbym VAR=$(application arg0 arg1)
. Potrzebuję podobnego zachowania w systemie Windows przy użyciu pliku wsadowego.
Coś w stylu set VAR=application arg0 arg1
.
8 answers
Jedna droga to:
application arg0 arg1 > temp.txt
set /p VAR=<temp.txt
Inny to:
for /f %%i in ('application arg0 arg1') do set VAR=%%i
Zauważ, że pierwszy %
w %%i
jest używany do ucieczki %
po nim i jest potrzebny podczas używania powyższego kodu w pliku wsadowym, a nie w linii poleceń. Wyobraź sobie, twój test.bat
ma coś takiego:
for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i
echo %datetime%
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 13:12:17
Jako dodatek do tej poprzedniej odpowiedzi, można użyć wewnątrz wyrażenia for, którego symbolem jest:
for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59
@OP, możesz użyć dla pętli , aby uchwycić status powrotu Twojego programu, jeśli wyświetli coś innego niż liczby
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-24 02:47:30
Zakładając, że wyjście aplikacji jest numerycznym kodem zwrotnym, możesz wykonać następujące czynności
application arg0 arg1
set VAR=%errorlevel%
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-24 02:37:34
Podczas wykonywania: for /f %%i in ('application arg0 arg1') do set VAR=%%i
otrzymałem błąd: % % byłem nieoczekiwany w tym czasie.
Jako fix, musiałem wykonać powyżej jako for /f %i in ('application arg0 arg1') do set VAR=%i
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 11:14:52
Oprócz odpowiedzi, nie można bezpośrednio używać operatorów przekierowań wyjściowych w set część pętli for
(np. jeśli chcesz ukryć wyjście stderror przed użytkownikiem i dostarczyć ładniejszy komunikat o błędzie). Zamiast tego musisz uciec od nich z postacią karetki (^
):
for /f %%O in ('some-erroring-command 2^> nul') do (echo %%O)
Reference: Redirect output of command in for loop of batch script
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:24
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
REM Prefer backtick usage for command output reading:
REM ENABLEDELAYEDEXPANSION is required for actualized
REM outer variables within for's scope;
REM within for's scope, access to modified
REM outer variable is done via !...! syntax.
SET CHP=C:\Windows\System32\chcp.com
FOR /F "usebackq tokens=1,2,3" %%i IN (`%CHP%`) DO (
IF "%%i" == "Aktive" IF "%%j" == "Codepage:" (
SET SELCP=%%k
SET SELCP=!SELCP:~0,-1!
)
)
echo actual codepage [%SELCP%]
ENDLOCAL
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 13:39:41
Napisałem skrypt, który pingi google.com co 5 sekund i rejestrowanie wyników z aktualnym czasem. Tutaj można znaleźć wyjście do zmiennych "commandLineStr" (z indeksami)
@echo off
:LOOPSTART
echo %DATE:~0% %TIME:~0,8% >> Pingtest.log
SETLOCAL ENABLEDELAYEDEXPANSION
SET scriptCount=1
FOR /F "tokens=* USEBACKQ" %%F IN (`ping google.com -n 1`) DO (
SET commandLineStr!scriptCount!=%%F
SET /a scriptCount=!scriptCount!+1
)
@ECHO %commandLineStr1% >> PingTest.log
@ECHO %commandLineStr2% >> PingTest.log
ENDLOCAL
timeout 5 > nul
GOTO LOOPSTART
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 12:25:09