是否可以将批处理文件的语句输出设置为变量,例如:
findstr testing > %VARIABLE%
echo %VARIABLE%
是否可以将批处理文件的语句输出设置为变量,例如:
findstr testing > %VARIABLE%
echo %VARIABLE%
Answers:
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
构造的某些部分会覆盖它。顺便说一句,如此基本的东西需要多么疯狂的外观代码令人难以置信。
我在Interweb那里发现了这个线程。归结为:
@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 Hardware上的线程。
在一行中:
FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)
命令输出将在%g中设置,然后在VAR中设置。
详细信息:https : //ss64.com/nt/for_cmd.html
要读取文件...
set /P Variable=<File.txt
写入文件
@echo %DataToWrite%>File.txt
注意; 在<>字符前有空格会导致在变量末尾添加空格,
要添加到文件(如记录器程序),请首先在其中创建一个文件,并使用单个回车键e.txt
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
对名为的变量的操作,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 %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:那也不行!