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

时间:2012-03-27 14:29:14

标签: batch-file

我正在处理批处理脚本。

我想将行的计数存储在变量中。

  

set var = mysql -uroot -proot -e“select table(*)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 个答案:

答案 0 :(得分:2)

我的脚本中至少可以看到两个问题:

  1. IN( )内的双引号中的字符串被视为文字,而不是文件路径/名称,除非您指定{ {1}}选项,它强制执行不同的语义,从而将双引号字符串或非引用字符串视为文件名。

  2. 您将usebackq存储到<space>%%a变量中,而不是output<space>存入%%a

  3. 在你修复了这两个之后,还会有一个(可能只是一个)问题。您正在为变量赋值,然后使用立即变量扩展(output)在同一个括号内的块(这是您的循环体)中评估变量。这不能按预期工作。问题是,括号内的块完全被解析为一个单元,即在执行第一个命令之前解析其所有命令。您可以猜测,在这种情况下,您的%var%表达式将评估为空,因为%output%在解析时尚未分配值。 (当 分配一个值时,它将不会改变任何内容,因为前一个(空)值已经替换了表达式。)

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

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

    %var%

答案 1 :(得分:2)

您只需使用内容var定义mysql -uroot ...,但不执行它! 所以不应该有F:\count.txt个文件。

您的set-syntax错误,删除空格(来自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%!
)

答案 2 :(得分:0)

你走在正确的轨道上,但你显示的FOR / F命令是不正确的语法 - 它会给出一个错误(我忽略了IN()子句,因为我知道它是故意不完整的。)

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

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

如果你做了那些修复并完成了你的IN()子句,那么它应该可行。如果没有,则IN()子句可能出错。如果您需要帮助诊断问题,则应发布整个命令。