330

MSバッチファイルを使用して、プログラムの出力を変数に割り当てる必要があります。

したがって、GNU Bashシェルでは、を使用しますVAR=$(application arg0 arg1)。バッチファイルを使用するWindowsでも同様の動作が必要です。

のようなものset VAR=application arg0 arg1

4

10 に答える 10

480

1つの方法は次のとおりです。

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

もう1つは:

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

最初の%in%%iは、その後をエスケープするために使用さ%れ、コマンドラインではなくバッチファイルで上記のコードを使用する場合に必要であることに注意してください。想像してみてください、あなたtest.batは次のようなものを持っています:

for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i
echo %datetime%
于 2010-02-26T07:13:44.917 に答える
77

この前の答えに加えて、パイプはforステートメント内で使用でき、caretシンボルでエスケープできます。

    for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i
于 2013-10-18T07:11:42.980 に答える
10

@OP、数値以外のものを出力する場合は、forループを使用してプログラムの戻りステータスをキャプチャできます

于 2010-02-24T02:47:30.607 に答える
10

実行時:for /f %%i in ('application arg0 arg1') do set VAR=%%iエラーが発生していました:%%iは現時点では予期していませんでした。修正として、私は上記のように実行する必要がありましたfor /f %i in ('application arg0 arg1') do set VAR=%i

于 2016-12-07T11:14:52.807 に答える
9

バッチマクロを使用して、bashシェルの動作に少し似たコマンド出力を簡単にキャプチャできます。

マクロの使用法は単純で、次のようになります。

%$set% VAR=application arg1 arg2

そしてそれはパイプでも動作します

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

マクロは配列のように変数を使用し、各行を個別のインデックスに格納します。
のサンプルで%$set% allDrives="wmic logicaldiskは、​​次の変数が作成されます。

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>

これを使用するには、マクロ自体がどのように機能するかを理解することは重要ではありません。

完全な例

@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
于 2019-01-29T16:14:47.183 に答える
8

アプリケーションの出力が数値の戻りコードであると仮定すると、次のことができます。

application arg0 arg1
set VAR=%errorlevel%
于 2010-02-24T02:37:34.223 に答える
3

答えに加えて、ループの設定部分で出力リダイレクト演算子を直接使用することはできませんfor(たとえば、ユーザーからのstderror出力を非表示にして、より適切なエラーメッセージを提供する場合)。代わりに、注意文字(^)でそれらをエスケープする必要があります。

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

参照:バッチスクリプトのforループでコマンドの出力をリダイレクトする

于 2015-07-15T11:46:37.263 に答える
2
@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
于 2016-09-01T13:22:26.237 に答える
1

5秒ごとにgoogle.comにpingを実行し、現在の時刻で結果をログに記録するスクリプトを作成しました。ここでは、変数「commandLineStr」(インデックス付き)への出力を見つけることができます

@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
于 2018-04-02T12:25:09.433 に答える
0

コマンドの出力を変数に設定するためのいくつかのマクロ/

コマンドプロンプトで直接

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%

引数付きマクロ

このマクロは引数を関数として受け入れるので、バッチファイルで使用するのに最も近いマクロだと思います。

@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マクロ

前のマクロほど読みやすくありません。

::::::::::::::::::::::::::::::::::::::::::::::::::
;;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%

一時ファイルを使用したマクロ

読みやすく、SSDドライブがある場合はそれほど遅くはありませんが、それでも一時ファイルが作成されます。

@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%##
于 2020-11-09T11:06:37.530 に答える