コマンド出力をバッチファイルの変数として設定する方法


242

バッチファイルのステートメントの出力を変数に設定することは可能ですか?

findstr testing > %VARIABLE%

echo %VARIABLE%





回答:


275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

私は常にUSEBACKQを使用するので、挿入する文字列や長いファイル名がある場合は、コマンドを混乱させることなく二重引用符を使用できます。

出力に複数の行が含まれる場合、これを行うことができます

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL

3
Win7システムで私のために働いた、ありがとう!(そして、はい、それは7年の有用性です)PSコマンドで%を%%に拡張することを忘れないでください!
Dmitry Ilukhin 2018年

これはうまくいきます...出力に感嘆符(!)が含まれていない限り、これらは使用時に制御文字として解釈されますENABLEDELAYEDEXPANSION
JonathanDavidArndt

使用する必要がある場合を除いて、うまく|機能しません。
Matt Vukomanovic

5
@MattVukomanovicそれは使用して私の作品^|の代わりに|説明したように、ここで
AST

commandとにかく終了コードをキャプチャすることは可能ですか?私はそれがゼロ以外のコードを返すと確信していますが%ERRORLEVEL%、それを使用しようとする場所に関係なく(doブロック内であっても)常に0 が含まれています。だから私はそのfor構造の一部がそれを上書きしていると思います。ところで、とても初歩的なものにクレイジーなコードが必要なのは信じられないほどです。
David FerenczyRogožan18年

68

インターウェブということでこのスレッドを見つけました。要約すると:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

コマンドの出力を一時ファイルにリダイレクトし、その一時ファイルの内容を以下のように変数に入れることもできます。ただし、マルチライン入力では機能しません。

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

トムのハードウェアのスレッドへのクレジット。


3
ボトムアプローチ(他のすべての方法で望ましい)の唯一の欠点は、複数行出力では機能しないことです。
dgo 2016年

VERの場合は別の方法を使用します。/f "tokens = 2 delims = [、]"の場合、%% a in( 'ver')do set version %% a echo%version%
Hardoman

1
あなたはlikesuchashereby-imagebin.ca/v/4NPSlQFgifceの2番目の結果です
Shmuel

2番目の例は、chromedriver.exeのバージョンとバージョン番号を含むテキストファイルをチェックするバッチファイルを作成するのに大いに役立ちました。私は古いDOS恐竜で、setコマンドへの切り替えを認識していませんでした。他のものは私にとってやり過ぎでした。
Bill Hileman、

47

1行で:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

コマンド出力は%gに設定され、次にVARに設定されます。

詳細:https : //ss64.com/nt/for_cmd.html


19
バッチが "%g"で実行されませんでした。「%% g」で実行されました。
サンティアゴヴィラフエルテ2018

5
+ Santiago Villafuerte:はい、バッチファイルから実行しているが、コマンドラインから実行したい場合(たとえば、バッチファイルに配置する前にテストする場合)、単一の%を使用します。
ブレントリッテンハウス、

19

ファイルを読むには...

set /P Variable=<File.txt

ファイルを書き込むには

@echo %DataToWrite%>File.txt

注意; <>文字の前にスペースがあると、変数の最後にスペースが追加されます。

ロガープログラムのようにファイルに追加するには、最初にe.txtという名前の単一のEnterキーを含むファイルを作成します

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

ログは次のようになります

Entry1
Entry2 

等々

とにかくいくつかの便利なこと


お返事ありがとうございます。ところで、 "set / P Variable = <File.txt"はファイルの最初の行のみを読み取ります
Deepscorn

18

これらの答えはすべて私が必要とした答えに非常に近かった。これはそれらを拡張する試みです。

バッチファイル

.batファイル内から実行していて、複雑なコマンドjq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonをという名前の変数にエクスポートできる単一行が必要な場合は、次のようにしますAWS_ACCESS_KEY

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

コマンドラインで

C:\プロンプトが表示されている場合は、jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json名前の付いた変数のような複雑なコマンドを実行できる1行がAWS_ACCESS_KEY必要です。

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

説明

上記の2つの答えの唯一の違いは、コマンドラインでは、変数に単一の%を使用することです。バッチファイルでは、パーセント記号(%%)を2倍にする必要があります。

コマンドにはコロン、引用符、括弧が含まUSEBACKQれているため、バッククォートを使用して実行するコマンドを指定し、その中のあらゆる種類の面白い文字を指定できるように、オプションに行を含める必要があります。


13

一時ファイルに出力して変数に読み込まない場合、このコードはコマンドの結果を直接変数に格納します。

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

検索文字列を二重引用符で囲む場合:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

このコードをバッチファイルに保存する場合は、%記号を追加します。

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

ディレクトリ内のファイル数をカウントして変数に格納する便利な例:(パイピングを示しています)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

代わりに、コマンドのカッコ内の二重引用符」または重大なアクセント`の単一引用符の使用に注意してください。これは、掃除機の代替であるdelimstokensまたはusebackqforループ。

Win 10 CMDでテスト済み。


1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause

これがどのように問題を解決するのか分かりません。appcmdは標準プログラムではないので、プログラムの出力を変数に割り当てる場所がわかりません。ついにいくつかの説明が必要です
jeb

-3

私はそれをこのようにテストしました、そしてそれはうまくいきました:

SET /P Var= | Cmd

コマンドを変数にパイプすることにより、プロンプトはコマンド " Cmd"の結果を変数 " Var"に挿入します。

更新:

それは機能しません、私の悪い、私がしたスクリプトはこれでした:

SET /P Var= | dir /b *.txt
echo %Var%

実際には " test.txt" と言って表示していましたが、実際には " dir /b *.txt"コマンドの結果を表示しており、ではありませんecho %var%。両方の出力が同じだったので混乱しました。


3
あなたが意図していたなら、あなたはあなたのパイプの方向を正しくするためにpipe the command into a variable promptそれdir /b *.txt | SET /P Var=を書いたはずです。PS:それもそのようには機能しません!
ジェシーチザム

-18

この助けを願っています

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
いいえ、これは質問の答えにはなりません。質問は、コマンドの出力を変数に取得しようとしています
jeb

簡単な方法は、ファイルに書き込み、そのファイルから読み取ることです。findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt echo%a%
Ben2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.