如何在批处理脚本中将SQL查询的输出存储到变量中?

3
我正在处理一个批处理脚本。
我希望将行数的计数存储在变量中。
例如:
set var = mysql -uroot -proot -e"select count(*) from table";
我也尝试了其他方式。
 set var= mysql -uroot -proot -e "select count(*) from table into outfile 'F:\count.txt'";

 for /f %%a in ("F:\count.txt") do ( 
set output = %%a
echo %output% 

pause 

)

在上述代码中,变量“output”未显示任何内容(为空)。
请帮我解决这个问题。
3个回答

2
我能看到你的脚本中至少有两个问题:
  1. IN( )中的双引号字符串被视为字面量,而不是文件路径/名称,除非你指定usebackq选项,它强制执行不同的语义,其中双引号字符串或非引号字符串被视为文件名。

  2. 你将<space>%%a存储到output<space>变量中,而不是将%%a存储到output变量中。

在你修复了这两个问题之后,可能还会剩下一个问题。你在同一括号块中赋值变量,然后使用立即变量扩展(%var%)在同一括号块中评估变量。这不能按预期工作。事实上,括号块被解析为一个单独的单元,即在第一个命令执行之前,所有命令都会被解析。正如你所料,这种情况下你的%output%表达式将评估为nothing,因为在解析时output还没有被赋值。(当output被赋值时,它将不会改变任何东西,因为之前(空的)值已经替换了表达式。)

你可以使用延迟变量扩展来解决这个问题,它使用不同的时间表进行评估。首先,你应该通过发出SETLOCAL EnableDelayedExpansion命令来启用延迟扩展,然后使用稍微不同的语法:!var!而不是%var%

因此,如果我们解决了上面提到的所有问题,循环可能如下所示:

SETLOCAL EnableDelayedExpansion

FOR /F "usebackq" IN ("F:\count.txt") DO (
SET output=%%a
ECHO !output!
)

2
您只是定义了内容为 mysql -uroot ... 的变量 var,但您并没有执行它!因此不应该有一个F:\count.txt文件。
您的语法设置有误,请去掉set output=%%a中的空格,否则将创建一个名为output<space>而非output的变量。
您的代码可能如下所示:
mysql -uroot -proot -e "select count(*) from table into outfile 'F:\count.txt'";
setlocal EnableDelayedExpansion
for /f "delims=" %%a in (F:\count.txt) do ( 
  set "output=%%a"
  echo !output%!
)

0

你的思路是对的,但是你展示的FOR /F命令不是正确的语法 - 它会报错(我忽略了IN()子句,因为我知道它是有意不完整的)。

"tokens="选项不完整,必须跟着至少一个数字或星号 - 请参阅文档以获取更多信息(从命令行键入HELP FOR)。在你的情况下,你不需要tokens选项 - "delims="就足够了。

DO(之间必须至少有一个空格。

如果你进行这些修复并完成你的IN()子句,那么它应该可以工作。如果它不能工作,那么你的IN()子句可能有问题。如果你想要帮助诊断问题,你应该发布整个命令。


我现在正在做的是:set var= mysql -uroot -proot -e "select count(*) from table into outfile 'F:\count.txt'"; for /f %%a in ("F:\count.txt") do ( echo %%a pause ) - Pratik Gujarathi
但是当我尝试将%%a的值存储在变量中,例如set output=%%a echo %output%,它会显示空值。 - Pratik Gujarathi
我的目标是将计数存储在一个变量中,并在后续的计算中使用它。就像我打算运行计数查询两次,并且希望在if条件中减去两个输出。 - Pratik Gujarathi
@PratikGujarathi - 我理解你的目标,但我不确定你尝试了什么代码。请编辑你的问题并发布精确的代码,格式正确,以便我们可以阅读它。不要只发布你认为失败的那一行,也要发布导致它的内容。 - dbenham
我先将输出保存到 count.txt 文件中,然后尝试读取该文件并将其值存储到变量中。但我认为我做错了什么,你明白我的逻辑吗? - Pratik Gujarathi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接