Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何将命令输出设置为批处理文件中的变量_Windows_Batch File - Fatal编程技术网

Windows 如何将命令输出设置为批处理文件中的变量

Windows 如何将命令输出设置为批处理文件中的变量,windows,batch-file,Windows,Batch File,是否可以将批处理文件的语句输出设置为变量,例如: findstr testing > %VARIABLE% echo %VARIABLE% 我在互联网上找到的。归结起来是: @echo off setlocal enableextensions for /f "tokens=*" %%a in ( 'VER' ) do ( set myvar=%%a ) echo/%%myvar%%=%myvar% pause endlocal 还可以将命令的输出重定向到临时文件

是否可以将批处理文件的语句输出设置为变量,例如:

findstr testing > %VARIABLE%

echo %VARIABLE%
我在互联网上找到的。归结起来是:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 
还可以将命令的输出重定向到临时文件,然后将该临时文件的内容放入变量中,如suchasherby。但它不适用于多行输入

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 
cmd>tmpFile
设置/p myvar=
归功于Tom硬件上的线程。

我在互联网上发现了这个东西。归结起来是:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%
还可以将命令的输出重定向到临时文件,然后将该临时文件的内容放入变量中,如suchasherby。但它不适用于多行输入

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 
cmd>tmpFile
设置/p myvar=
归功于汤姆硬件上的线程

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
我总是使用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
要读取文件

set /P Variable=<File.txt
注;在字符前面有空格也会导致在变量末尾添加空格

要添加到文件,如记录器程序, 首先创建一个文件,其中包含一个名为e.txt的enter键

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

总之,读一个文件需要一些有用的东西

set /P Variable=<File.txt
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
注;在字符前面有空格也会导致在变量末尾添加空格

要添加到文件,如记录器程序, 首先创建一个文件,其中包含一个名为e.txt的enter键

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

总之,在一行中有几个有用的东西:

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
FOR /F "tokens=*" %%g IN ('*your command*') do (SET VAR=%%g)
命令输出将在%g中设置,然后在VAR中设置

更多信息:

在一行中:

FOR /F "tokens=*" %%g IN ('*your command*') do (SET VAR=%%g)
命令输出将在%g中设置,然后在VAR中设置


更多信息:

这些答案都非常接近我需要的答案。这是对它们进行扩展的一种尝试

在批处理文件中 如果您在
.bat
文件中运行,并且需要一行代码,允许您将复杂的命令(如
jq-r.Credentials.AccessKeyId“c:\temp\mfa getCreds.json
导出到名为
AWS\u ACCESS\u KEY
的变量,那么您需要:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")
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
到名为
AWS\u ACCESS\u KEY
的变量,那么您需要:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")
FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")
解释 上面两个答案之间的唯一区别是,在命令行中,您在变量中使用了一个%。在批处理文件中,必须将百分号(%)加倍


由于该命令包含冒号、引号和括号,因此您需要在选项中包含
USEBACKQ
行,以便可以使用反引号指定要运行的命令,然后在其中指定各种有趣的字符。

这些答案都非常接近我需要的答案。这是对它们进行扩展的一种尝试

在批处理文件中 如果您在
.bat
文件中运行,并且需要一行代码,允许您将复杂的命令(如
jq-r.Credentials.AccessKeyId“c:\temp\mfa getCreds.json
导出到名为
AWS\u ACCESS\u KEY
的变量,那么您需要:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")
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
到名为
AWS\u ACCESS\u KEY
的变量,那么您需要:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")
FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")
解释 上面两个答案之间的唯一区别是,在命令行中,您在变量中使用了一个%。在批处理文件中,必须将百分号(%)加倍


由于该命令包含冒号、引号和括号,因此需要在选项中包含
USEBACKQ
行,以便可以使用反引号指定要运行的命令,然后在命令中指定各种有趣的字符。

如果不想输出到临时文件,然后读入变量,此代码将命令的结果直接存储到变量中:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%
@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 %i IN ('findstr "testing"') DO set VARIABLE=%i
如果要将此代码存储在批处理文件中,请添加额外的%符号:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i
计算目录中的文件数和存储在变量中的有用示例: (图示管道)

请注意,在命令括号中使用单引号而不是双引号“或严重重音”。这是
delims
tokens
usebackq
for
循环的更干净的替代方法


在Win 10 CMD上测试。

如果您不想输出到临时文件,然后读入变量,此代码将命令结果直接存储到变量中:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%
@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 %i IN ('findstr "testing"') DO set VARIABLE=%i
如果要将此代码存储在批处理文件中,请添加额外的%符号:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i
计算目录中的文件数和存储在变量中的有用示例: (图示管道)

请注意,在命令括号中使用单引号而不是双引号“或严重重音”。这是
delims
tokens
usebackq
for
循环的更干净的替代方案


在Win 10 CMD上测试。

一些注释和一些技巧

将结果分配给变量的“官方”方法是使用,尽管在其他答案中也显示了如何使用临时文件

对于命令处理,根据