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

findstr testing > %VARIABLE%

echo %VARIABLE%

当前回答

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

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

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

更新27/8/2021:

另一种方法是设置errorlevel变量,尽管许多人不鼓励在大型脚本上设置errorlevel,或者在安装的操作系统变体的新版本中设置错误级别。

此方法适用于存储的(返回)值为32位整数的情况。

如。 计算一个目录中文件的数量,并存储在一个名为errorlevel的变量中:

(dir /b /a-d ^| find /v /c "?") | (set /p myVar=& cmd /c exit /b %myVar%)

echo %errorlevel%
81
set /a %errorlevel%+1
82

REM Note: Win CMD arithmetic limit: 2147483647 (32-bit integers)
REM ie. an overflow would continue count at -2147483648
REM and reset again after reaching 2147483647

REM See tests below:
cmd /c exit /b 2147483647
echo %errorlevel%
2147483647

cmd /c exit /b 2147483648
echo %errorlevel%
-2147483648

cmd /c exit /b 2147483649
echo %errorlevel%
-2147483647

上面的方法可以修改为返回编码后的字符串,在父进程中进行解码(限制在32位以内)。

第三个例子,尽管用途有限(因为变量是在子进程中设置的,而不是在父进程中设置的):

(dir /b /a-d ^| find /v /c "?") | (set /p myVar=& set myVar)

在本例中,myVar的值被设置为目录中的文件数量

在win10 CMD上测试。

其他回答

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

在批处理文件中

如果您在.bat文件中运行,并且需要一行允许您导出像jq -r ". credentials这样复杂的命令。c: \ temp \ mfa-getCreds AccessKeyId”。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这样复杂的命令。c: \ temp \ mfa-getCreds AccessKeyId”。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行,以便使用反引号指定要运行的命令,然后在其中使用各种有趣的字符。

在一行中:

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

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

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

我在网上找到了这条线索。归结起来就是:

@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 

这要归功于汤姆硬件的帖子。

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

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

这里,我的变量名是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