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=
归功于汤姆硬件上的线程

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
要读取文件

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

要添加到文件,如记录器程序, 首先创建一个文件,其中包含一个名为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中设置


更多信息:

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

在批处理文件中 如果您在
.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上测试。

一些注释和一些技巧

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

对于命令处理,命令有两种形式,具体取决于是否使用了
usebackq
选项。在下面的所有示例中,使用整个输出而不拆分它

FOR /f "tokens=* delims=" %%A in ('whoami') do @set "I-Am=%%A"
FOR /f "usebackq tokens=* delims=" %%A in (`whoami`) do @set "I-Am=%%A"
如果直接在控制台中使用:

FOR /f "tokens=* delims=" %A in ('whoami') do set "I-Am=%A"
FOR /f "usebackq tokens=* delims=" %A in (`whoami`) do set "I-Am=%A"
%%A
是一个临时变量,仅在
命令上下文的
上可用,称为令牌。这两种形式在处理包含特定引号的参数时非常有用。对于其他语言或WMIC的REPL接口尤其有用。
尽管在这两种情况下,表达式都可以放在双引号中,并且仍然可以进行处理

下面是一个python示例(可以将括号中的表达式转换为单独的一行,以便于阅读):

要在同一中为块使用指定的变量,请同时检查

还有一些技巧 要避免编写for命令的所有参数,可以使用将结果分配给变量:

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%
宏的第一个参数是命令,第二个参数是我们要使用的变量的名称,两者之间用
(逗号)分隔。尽管这只适用于简单的场景

如果我们希望控制台使用类似的宏,我们可以使用

DOSKEY确实接受双引号作为参数的封闭符,因此这对于更简单的场景也很有用

FOR也可以很好地用于链接命令(尽管它不适合指定变量)

hostname |for /f "tokens=* delims=" %%# in ('more') do @(ping %%#)
也可以用宏来美化:

@echo off
:: --- defining chain command macros ---
set "result-as-[arg]:=|for /f "tokens=* delims=" %%# in ('more') do @("
set "[arg]= %%#)"
:::  --------------------------  :::

::Example:
hostname %result-as-[arg]:% ping %[arg]%
对于临时文件方法的completnes宏(无doskey定义,但也很容易实现。如果您有SSD,这不会太慢):


在大多数情况下,创建一个以变量名命名的临时文件可能是可以接受的。(因为您可能正在使用有意义的变量名…)

这里,我的变量名是SSH\u PAGEANT\u AUTH\u SOCK

dir /w "\\.\pipe\\"|find "pageant" > %temp%\SSH_PAGEANT_AUTH_SOCK && set /P SSH_PAGEANT_AUTH_SOCK=<%temp%\SSH_PAGEANT_AUTH_SOCK

dir/w“\\.\pipe\\\”\find“pageant”>%temp%\SSH\u pageant\u AUTH\u SOCK&&set/P SSH\u pageant\u AUTH\u SOCK=原件的可能副本实际上似乎是。另一个副本的可能副本只是为了好玩:可能的副本只是底部方法的缺点(这在所有其他方面都是可取的)对于版本,我会选择另一种方式:For/f“tokens=2 delims=[,]”%%a in('VER')do set version%%a echo%version%您是LikeSuchasherby的第二个结果-您的第二个示例在编写批处理文件以检查chromedriver.exe的版本与包含版本号的文本文件方面帮了我很大的忙。我是一个老DOS恐龙,不知道切换到set命令。其他东西对我来说太过分了我。我看不出这是如何解决问题的。
appcmd
不是一个标准程序,我看不出你在哪里分配了p
@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%##
::::::::::::::::::::::::::::::::::::::::::::::::::
;;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%
dir /w "\\.\pipe\\"|find "pageant" > %temp%\SSH_PAGEANT_AUTH_SOCK && set /P SSH_PAGEANT_AUTH_SOCK=<%temp%\SSH_PAGEANT_AUTH_SOCK