Assign output of a program to a variable using a MS batch file

前端 未结 10 855
梦谈多话
梦谈多话 2020-11-22 10:06

I need to assign the output of a program to a variable using a MS batch file.

So in GNU Bash shell I would use VAR=$(application arg0 arg1). I need a si

相关标签:
10条回答
  • 2020-11-22 10:43

    One way is:

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

    Another is:

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

    Note that the first % in %%i is used to escape the % after it and is needed when using the above code in a batch file rather than on the command line. Imagine, your test.bat has something like:

    for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i
    echo %datetime%
    
    0 讨论(0)
  • 2020-11-22 10:52

    @OP, you can use for loops to capture the return status of your program, if it outputs something other than numbers

    0 讨论(0)
  • 2020-11-22 10:55

    As an addition to this previous answer, pipes can be used inside a for statement, escaped by a caret symbol:

        for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i
    
    0 讨论(0)
  • 2020-11-22 10:55

    In addition to the answer, you can't directly use output redirection operators in the set part of for loop (e.g. if you wanna hide stderror output from a user and provide a nicer error message). Instead, you have to escape them with a caret character (^):

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

    Reference: Redirect output of command in for loop of batch script

    0 讨论(0)
  • 2020-11-22 10:56

    On Executing: for /f %%i in ('application arg0 arg1') do set VAR=%%i i was getting error: %%i was unexpected at this time. As a fix, i had to execute above as for /f %i in ('application arg0 arg1') do set VAR=%i

    0 讨论(0)
  • 2020-11-22 10:57

    You could use a batch macro for simple capturing of command outputs, a bit like the behaviour of the bash shell.

    The usage of the macro is simple and looks like

    %$set% VAR=application arg1 arg2
    

    And it works even with pipes

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

    The macro uses the variable like an array and stores each line in a separate index.
    In the sample of %$set% allDrives="wmic logicaldisk there will the following variables created:

    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>
    

    To use it, it's not important to understand how the macro itself works.

    The full example

    @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
    
    0 讨论(0)
提交回复
热议问题