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

时间:2011-06-15 15:00:22

标签: windows batch-file

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

findstr testing > %VARIABLE%

echo %VARIABLE%

11 个答案:

答案 0 :(得分:217)

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

答案 1 :(得分:54)

我在Interweb上发现了this thread。归结为:

@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 

归功于Tom's硬件上的主题。

答案 2 :(得分:26)

在一行中:

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

命令输出将在%g中设置,然后在VAR中设置。

更多信息:https://ss64.com/nt/for_cmd.html

答案 3 :(得分:17)

阅读文件......

set /P Variable=<File.txt

写一个文件

@echo %DataToWrite%>File.txt

请注意;在&lt;&gt;之前有空格字符导致在变量末尾添加空格,也

要添加到文件,例如记录器程序, 首先使用一个名为e.txt

的回车键创建一个文件
set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

您的日志将如下所示

Entry1
Entry2 

等等

无论如何有几件有用的东西

答案 4 :(得分:7)

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

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

请注意在命令括号中使用单引号而不是双引号“或重音`。这是{{1}中的delimstokensusebackq的更干净的替代方法}循环。

在Win 10 CMD上测试。

答案 5 :(得分:4)

一些笔记和一些技巧。

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

对于命令处理,FOR命令有两种形式,具体取决于是否使用了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是仅在FOR命令上下文中可用的临时变量,称为令牌。当您处理包含特定引号的参数时,这两种形式可能很有用。对于其他语言或WMIC的REPL接口,它特别有用。 尽管在两种情况下,表达式都可以用双引号引起来,并且仍然可以处理。

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

@echo off

for /f "tokens=* delims=" %%a in (
  '"python -c ""print("""Message from python""")"""'
) do (
    echo processed message from python: "%%a"
)

要在同一 FOR 块中使用分配的变量,请同时检查DELAYED EXPANSION

一些技巧

要避免编写FOR命令的所有参数,可以使用 MACRO 将结果分配给变量:

@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

doskey assign=for /f "tokens=1,2 delims=," %a in ("$*") do @for /f "tokens=* delims=" %# in ('"%a"') do @set "%b=%#"
rem  -- example --
assign WHOAMI /LOGONID,my-id
echo %my-id%

DOSKEY确实接受双引号作为参数的括号,因此这对于更简单的情况也很有用。

FOR还可以与pipes配合使用,后者可以用于链接命令(尽管它对分配变量不是很好。

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,这不会太慢):

@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%##

对于/ 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%

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

在批处理文件中

如果您是从.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的变量运行类似AWS_ACCESS_KEY的复杂命令,那么您需要这样做: >

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

说明

上面两个答案之间的唯一区别是在命令行上,您在变量中使用了一个%。在批处理文件中,您必须将百分比符号(%%)加倍。

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

答案 8 :(得分:0)

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

在这里,我的变量名是SSH_PAGEANT_AUTH_SOCK

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

答案 9 :(得分:-3)

我已经像这样测试了它并且有效:

SET /P Var= | Cmd

通过将命令传递给变量,提示符将插入命令&#34; Cmd&#34;的结果。进入变量&#34; Var&#34;。

<强>更新

它没有用,我的坏,我做的脚本是这样的:

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

它实际上显示让我们说&#34; test.txt&#34;,但它实际上显示了&#34; dir /b *.txt&#34;的结果。命令,而不是echo %var%。我感到困惑,因为两个输出都相同。

答案 10 :(得分:-14)

希望这个帮助

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