此问题已在此处有答案:
Assign output of a program to a variable using a MS batch file(12个回答)
11个月前关闭。
是否可以将批处理文件的语句输出设置为变量,例如:
findstr testing > %VARIABLE%
echo %VARIABLE%
此问题已在此处有答案:
Assign output of a program to a variable using a MS batch file(12个回答)
11个月前关闭。
是否可以将批处理文件的语句输出设置为变量,例如:
findstr testing > %VARIABLE%
echo %VARIABLE%
9条答案
按热度按时间zxlwwiss1#
我总是使用USEBACKQ,这样,如果你有一个字符串插入或一个长文件名,你可以使用你的双引号没有搞砸命令。
现在,如果您的输出将包含多行,您可以这样做
u91tlkcl2#
在一行中:
命令输出将以%g设置,然后以VAR设置。
更多信息:https://ss64.com/nt/for_cmd.html
kulphzqa3#
我在网上找到了this thread。归结为:
你也可以将命令的输出重定向到一个临时文件,然后将该临时文件的内容放入你的变量中,就像这样。
这是Tom's Hardware上的一个帖子。
sshcrbum4#
如果你不想输出到一个临时文件,然后读入一个变量,这段代码将命令的结果直接存储到一个变量中:
如果要将搜索字符串括在双引号中:
如果要将此代码存储在批处理文件中,请添加额外的%符号:
一个有用的例子来计算目录中的文件数量&存储在变量中:(图示管道)
请注意,在命令括号中使用单引号而不是双引号“或重音符
。这是
for循环中
delims,
tokens或
usebackq`的更清晰的替代方案。更新27/8/2021:
另一种方法是设置errorlevel变量,尽管许多人不鼓励在大型脚本上使用setting errorlevel,或者在新安装的操作系统变体的cmd版本中使用setting errorlevel。
此方法适用于要存储的(返回)值适合32位整数的情况。
例如,计算目录中的文件数并存储在名为
count
的变量中:详细- Win CMD整数限制测试:
Win CMD算术限制:2147483647(32位整数)
堆栈溢出将在-2147483648处继续计数,并在达到2147483647后再次重置
可以修改上述方法以返回要在父进程中解码的编码字符串(在32位限制内)。
第三个例子,虽然用途有限(因为变量是在子进程中设置的,而不是父进程):
在本例中,myVar的值被设置为目录中的文件数
在Win 10 CMD上测试。
2admgd595#
要读取文件...
写入文件
注意;在〈〉字符前有空格会导致在变量的末尾添加一个空格,也是
要添加到一个文件,如日志程序,首先创建一个文件,其中包含一个回车键,称为e.txt
日志将如下所示
等等
不管怎样,有几个有用的东西
bnlyeluc6#
这些答案都非常接近我所需要的答案。这是对它们进行扩展的一种尝试。
批量文件中
如果你在一个
.bat
文件中运行,并且你想要一个单行,允许你导出一个复杂的命令,如jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
到一个名为AWS_ACCESS_KEY
的变量,那么你需要这样:命令行
如果你在
C:\
提示符下,你想要一个单行,允许你运行一个复杂的命令,比如jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
到一个名为AWS_ACCESS_KEY
的变量,那么你需要这样:说明
上面两个答案之间的唯一区别是,在命令行中,您在变量中使用单个%。在批处理文件中,您必须在百分号(%%)上使用两个。
由于该命令包含冒号、引号和圆括号,因此需要在选项中包含
USEBACKQ
行,以便可以使用反引号指定要运行的命令,然后在其中包含各种有趣的字符。mqkwyuun7#
一些笔记和一些技巧。
将result赋值给变量的“官方”方法是使用
FOR /F
,尽管在其他答案中也显示了如何使用临时文件。对于命令处理,
FOR
命令有两种形式,这取决于是否使用usebackq
选项。在下面的所有示例中,使用整个输出而不分割它。如果直接在控制台中使用:
%%A
是一个临时变量,仅在FOR
命令上下文中可用,称为token。这两种形式在处理包含特定引号的参数时很有用。它在其他语言或WMIC的REPL接口中特别有用。尽管在这两种情况下,表达式都可以放在双引号中,但它仍然可以被处理。下面是一个python的例子(可以将括号中的表达式转换到单独的一行,以便于阅读):
要在同一个FOR块中使用赋值变量,还需要检查DELAYED EXPANSION
And some tricks
为了保存编写FOR命令的所有参数,您可以使用***MACRO***将结果赋值给变量:
宏的第一个参数是命令,第二个参数是我们要使用的变量的名称,两者之间用
,
(逗号)分隔。如果我们想要一个类似的控制台宏,我们可以使用***DOSKEY***
DOSKEY不接受双引号作为参数的覆盖,因此这对于更简单的场景也很有用。
FOR也可以很好地与pipes一起工作,pipes可以用于链接命令(尽管它不太适合分配变量)。
它也可以用宏来美化:
对于临时文件方法的完整宏(没有doskey定义,但它也可以很容易地完成。如果你有SSD,这不会太慢):
对于带有另一个宏的/f:
t30tvxxf8#
7y4bm7vi9#
在大多数情况下,创建一个以变量名命名的临时文件可能是可以接受的。(因为你可能使用有意义的变量名…)
这里,我的变量名是SSH_PAGEANT_AUTH_SOCK