370 Stimmen

Zuweisung der Ausgabe eines Programms an eine Variable mit Hilfe einer MS-Batch-Datei

Ich muss die Ausgabe eines Programms mithilfe einer MS-Batch-Datei einer Variablen zuweisen.

In der GNU Bash-Shell würde ich also verwenden VAR=$(application arg0 arg1) . Ich brauche ein ähnliches Verhalten unter Windows mit einer Batch-Datei.

Etwas wie set VAR=application arg0 arg1 .

Ähnliche Fragen

5voto

akf Punkte 37387

Unter der Annahme, dass die Ausgabe Ihrer Anwendung ein numerischer Rückgabewert ist, können Sie wie folgt vorgehen

application arg0 arg1
set VAR=%errorlevel%

3voto

Kubo2 Punkte 321

Zusätzlich zur Antwort können Sie die Operatoren zur Ausgabeumleitung nicht direkt in der einstellen. Teil von for Schleife (z.B. wenn Sie die stderror-Ausgabe vor dem Benutzer verbergen und eine schönere Fehlermeldung anzeigen wollen). Stattdessen müssen Sie sie mit einem Caret-Zeichen ( ^ ):

for /f %%O in ('some-erroring-command 2^> nul') do (echo %%O)

Referenz: Ausgabe eines Befehls in der for-Schleife eines Batch-Skripts umleiten

2voto

rcm Punkte 21
@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

2voto

Ja Vy Punkte 11

Ich habe ein Skript geschrieben, das google.com alle 5 Sekunden anpingt und die Ergebnisse mit der aktuellen Zeit protokolliert. Hier finden Sie die Ausgabe in die Variablen "commandLineStr" (mit Indizes)

@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

1voto

npocmaka Punkte 52753

Einige Makros, um die Ausgabe eines Befehls auf eine Variable zu setzen/

Für direkt in der Eingabeaufforderung

c:\>doskey assign=for /f "tokens=1,2 delims=," %a in ("$*") do @for /f "tokens=* delims=" %# in ('"%a"') do @set "%b=%#"

c:\>assign WHOAMI /LOGONID,my-id

c:\>echo %my-id%

Makro mit Argumenten

Da diese Makro akzeptiert Argumente Als Funktion ist es meiner Meinung nach das schönste Makro, das in einer Stapeldatei verwendet werden kann:

@echo off

::::: ---- defining the assign macro ---- ::::::::
setlocal DisableDelayedExpansion
(set LF=^
%=EMPTY=%
)
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"

::set argv=Empty
set assign=for /L %%n in (1 1 2) do ( %\n%
   if %%n==2 (%\n%
      setlocal enableDelayedExpansion%\n%
      for /F "tokens=1,2 delims=," %%A in ("!argv!") do (%\n%
         for /f "tokens=* delims=" %%# in ('%%~A') do endlocal^&set "%%~B=%%#" %\n%
      ) %\n%
   ) %\n%
) ^& set argv=,

::::: -------- ::::::::

:::EXAMPLE
%assign% "WHOAMI /LOGONID",result
echo %result%

FOR /F Makro

nicht so leicht zu lesen wie das vorherige Makro.

::::::::::::::::::::::::::::::::::::::::::::::::::
;;set "{{=for /f "tokens=* delims=" %%# in ('" &::
;;set "--=') do @set ""                        &::
;;set "}}==%%#""                               &::
::::::::::::::::::::::::::::::::::::::::::::::::::

:: --examples

::assigning ver output to %win-ver% variable
%{{% ver %--%win-ver%}}%
echo 3: %win-ver%

::assigning hostname output to %my-host% variable
%{{% hostname %--%my-host%}}%
echo 4: %my-host%

Makro mit einer temporären Datei

Es ist einfacher zu lesen und nicht so langsam, wenn Sie ein SSD-Laufwerk haben, aber es wird trotzdem eine temporäre Datei erstellt.

@echo off

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;;set "[[=>"#" 2>&1&set/p "&set "]]==<# & del /q # >nul 2>&1" &::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

chcp %[[%code-page%]]%
echo ~~%code-page%~~

whoami %[[%its-me%]]%
echo ##%its-me%##

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X