バッチファイルのステートメントの出力を変数に設定することは可能ですか?
findstr testing > %VARIABLE%
echo %VARIABLE%
バッチファイルのステートメントの出力を変数に設定することは可能ですか?
findstr testing > %VARIABLE%
echo %VARIABLE%
回答:
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
ENABLEDELAYEDEXPANSION
|
機能しません。
command
とにかく終了コードをキャプチャすることは可能ですか?私はそれがゼロ以外のコードを返すと確信していますが%ERRORLEVEL%
、それを使用しようとする場所に関係なく(do
ブロック内であっても)常に0 が含まれています。だから私はそのfor
構造の一部がそれを上書きしていると思います。ところで、とても初歩的なものにクレイジーなコードが必要なのは信じられないほどです。
インターウェブということでこのスレッドを見つけました。要約すると:
@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
トムのハードウェアのスレッドへのクレジット。
1行で:
FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)
コマンド出力は%gに設定され、次にVARに設定されます。
ファイルを読むには...
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
等々
とにかくいくつかの便利なこと
これらの答えはすべて私が必要とした答えに非常に近かった。これはそれらを拡張する試みです。
.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
れているため、バッククォートを使用して実行するコマンドを指定し、その中のあらゆる種類の面白い文字を指定できるように、オプションに行を含める必要があります。
一時ファイルに出力して変数に読み込まない場合、このコードはコマンドの結果を直接変数に格納します。
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
代わりに、コマンドのカッコ内の二重引用符」または重大なアクセント`の単一引用符の使用に注意してください。これは、掃除機の代替であるdelims
、tokens
またはusebackq
でfor
ループ。
Win 10 CMDでテスト済み。
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
は標準プログラムではないので、プログラムの出力を変数に割り当てる場所がわかりません。ついにいくつかの説明が必要です
私はそれをこのようにテストしました、そしてそれはうまくいきました:
SET /P Var= | Cmd
コマンドを変数にパイプすることにより、プロンプトはコマンド " Cmd
"の結果を変数 " Var
"に挿入します。
更新:
それは機能しません、私の悪い、私がしたスクリプトはこれでした:
SET /P Var= | dir /b *.txt
echo %Var%
実際には " test.txt
" と言って表示していましたが、実際には " dir /b *.txt
"コマンドの結果を表示しており、ではありませんecho %var%
。両方の出力が同じだったので混乱しました。
pipe the command into a variable prompt
それdir /b *.txt | SET /P Var=
を書いたはずです。PS:それもそのようには機能しません!