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

522voto

Carlos Gutiérrez Punkte 13346

Eine Möglichkeit ist:

application arg0 arg1 > temp.txt
set /p VAR=<temp.txt

Eine andere ist:

for /f %%i in ('application arg0 arg1') do set VAR=%%i

Beachten Sie, dass die erste % en %%i wird verwendet, um die % und wird benötigt, wenn der obige Code in einer Stapeldatei und nicht in der Befehlszeile verwendet wird. Stellen Sie sich vor, Ihr test.bat hat etwas wie:

for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i
echo %datetime%

90voto

Renat Punkte 6450

Als Ergänzung zu diese vorherige Antwort können Pipes innerhalb einer for-Anweisung verwendet werden, wobei sie durch ein Caret-Symbol geschützt werden:

    for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i

24voto

Munish Mehta Punkte 163

Bei der Ausführung des Folgenden:

for /f %%i in ('application arg0 arg1') do set VAR=%%i

Ich habe die Fehlermeldung erhalten:

%%i was unexpected at this time.

Um das zu beheben, habe ich eine einzelne % Zeichen wie dieses:

for /f %i in ('application arg0 arg1') do set VAR=%i

Zusammenfassung :

  • Utilice %% in einer Stapeldatei
  • Utilice % außerhalb einer Stapeldatei (in einer Befehlszeile)

10voto

ghostdog74 Punkte 305138

@OP, können Sie for-Schleifen um den Rückgabestatus Ihres Programms zu erfassen, wenn es etwas anderes als Zahlen ausgibt

10voto

jeb Punkte 74279

Sie könnten ein Batch-Makro für die einfache Erfassung von Befehlsausgaben verwenden, ähnlich dem Verhalten der Bash-Shell.

Die Verwendung des Makros ist einfach und sieht wie folgt aus

%$set% VAR=application arg1 arg2

Und es funktioniert sogar mit Rohren

%$set% allDrives="wmic logicaldisk get name /value | findstr "Name""

Das Makro verwendet die Variable wie ein Array und speichert jede Zeile in einem eigenen Index.
In der Stichprobe von %$set% allDrives="wmic logicaldisk werden die folgenden Variablen erstellt:

allDrives.Len=5
allDrives.Max=4
allDrives[0]=Name=C:
allDrives[1]=Name=D:
allDrives[2]=Name=F:
allDrives[3]=Name=G:
allDrives[4]=Name=Z:
allDrives=<contains the complete text with line feeds>

Um es zu benutzen, ist es nicht wichtig, zu verstehen, wie das Makro selbst funktioniert.

Das vollständige Beispiel

@echo off
setlocal

call :initMacro

%$set% ipOutput="ipconfig"
call :ShowVariable ipOutput
echo First line is %ipOutput[0]%

echo( 
%$set% driveNames="wmic logicaldisk get name /value | findstr "Name""
call :ShowVariable driveNames

exit /b

:ShowVariable
setlocal EnableDelayedExpansion
for /L %%n in (0 1 !%~1.max!) do (
    echo %%n: !%~1[%%n]!
)
echo(
exit /b

:initMacro
if "!!"=="" (
    echo ERROR: Delayed Expansion must be disabled while defining macros
    (goto) 2>nul
    (goto) 2>nul
)
(set LF=^
%=empty=%
)
(set \n=^^^
%=empty=%
)

set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n%
    setlocal EnableDelayedExpansion                                 %\n%
    for /f "tokens=1,* delims== " %%1 in ("!argv!") do (            %\n%
        endlocal                                                    %\n%
        endlocal                                                    %\n%
        set "%%~1.Len=0"                                            %\n%
        set "%%~1="                                                 %\n%
        if "!!"=="" (                                               %\n%
            %= Used if delayed expansion is enabled =%              %\n%
                setlocal DisableDelayedExpansion                    %\n%
                for /F "delims=" %%O in ('"%%~2 | findstr /N ^^"') do ( %\n%
                if "!!" NEQ "" (                                    %\n%
                    endlocal                                        %\n%
                    )                                               %\n%
                setlocal DisableDelayedExpansion                    %\n%
                set "line=%%O"                                      %\n%
                setlocal EnableDelayedExpansion                     %\n%
                set pathExt=:                                       %\n%
                set path=;                                          %\n%
                set "line=!line:^=^^!"                              %\n%
                set "line=!line:"=q"^""!"                           %\n%
                call set "line=%%line:^!=q""^!%%"                   %\n%
                set "line=!line:q""=^!"                             %\n%
                set "line="!line:*:=!""                             %\n%
                for /F %%C in ("!%%~1.Len!") do (                   %\n%
                    FOR /F "delims=" %%L in ("!line!") Do (         %\n%
                        endlocal                                    %\n%
                        endlocal                                    %\n%
                        set "%%~1[%%C]=%%~L" !                      %\n%
                        if %%C == 0 (                               %\n%
                            set "%%~1=%%~L" !                       %\n%
                        ) ELSE (                                    %\n%
                            set "%%~1=!%%~1!!LF!%%~L" !             %\n%
                        )                                           %\n%
                    )                                               %\n%
                    set /a %%~1.Len+=1                              %\n%
                )                                                   %\n%
            )                                                       %\n%
        ) ELSE (                                                    %\n%
            %= Used if delayed expansion is disabled =%             %\n%
            for /F "delims=" %%O in ('"%%~2 | findstr /N ^^"') do ( %\n%
                setlocal DisableDelayedExpansion                    %\n%
                set "line=%%O"                                      %\n%
                setlocal EnableDelayedExpansion                     %\n%
                set "line="!line:*:=!""                             %\n%
                for /F %%C in ("!%%~1.Len!") DO (                   %\n%
                    FOR /F "delims=" %%L in ("!line!") DO (         %\n%
                        endlocal                                    %\n%
                        endlocal                                    %\n%
                        set "%%~1[%%C]=%%~L"                        %\n%
                    )                                               %\n%
                    set /a %%~1.Len+=1                              %\n%
                )                                                   %\n%
            )                                                       %\n%
        )                                                           %\n%
        set /a %%~1.Max=%%~1.Len-1                                  %\n%
)                                                                   %\n%
    ) else setlocal DisableDelayedExpansion^&set argv=

goto :eof

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