我正在处理批处理脚本。
我想将行的计数存储在变量中。
像
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”不显示任何内容(空)。
请帮帮我。
答案 0 :(得分:2)
我的脚本中至少可以看到两个问题:
IN( )
内的双引号中的字符串被视为文字,而不是文件路径/名称,除非您指定{ {1}}选项,它强制执行不同的语义,从而将双引号字符串或非引用字符串视为文件名。
您将usebackq
存储到<space>%%a
变量中,而不是output<space>
存入%%a
。
在你修复了这两个之后,还会有一个(可能只是一个)问题。您正在为变量赋值,然后使用立即变量扩展(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()子句可能出错。如果您需要帮助诊断问题,则应发布整个命令。