批处理文件执行问题(CALL 不起作用)

Posted

技术标签:

【中文标题】批处理文件执行问题(CALL 不起作用)【英文标题】:Batch file execution issue (CALL does NOT work) 【发布时间】:2015-03-22 15:34:10 【问题描述】:

几天来我一直在疯狂研究为什么我的批处理文件不能正常执行。当我在命令提示符下复制并粘贴代码时,它工作正常,但执行批处理文件只运行一行,然后停止。

这是批处理文件中的代码:

    sqlplus -s user/password
    set colsep '    '
    set linesize 32000
    set echo off
    set feedback off
    set trimspool on
    set newpage 0
    set pagesize 0
    spool c:\temp\suggmoves.txt
    select * from suggestive_moves;
    spool off
    quit
    exit

我找到的唯一解决方案是使用 CALL,但我没有调用另一个批处理文件,而且无论如何都没有用。

【问题讨论】:

【参考方案1】:

这不是批处理文件。那是一个 SQLPlus 脚本。

它从命令行运行的原因是因为 SQLPlus 向您展示了它自己的命令提示符。从set colsepquit 的所有内容都需要输入到SQLPlus 的提示符中。您编写的批处理文件正在将它们输入到 Windows 命令提示符中。

要做你想做的事,把 SQLPlus 命令放到一个单独的文件中,并使用 SQLPlus 的 @ 选项:

sqlplus -s user/password @sqlscript.sql

【讨论】:

太棒了!谢谢!【参考方案2】:

您必须重定向输入以通过 sqlplus 执行您的命令,而不是将其解释为 shell 命令并且不在 sqlplus 中执行任何操作。我认为 sqlplus 等待任何停止脚本执行的输入,直到 sqlplus 停止/杀死/退出。

要在脚本中直接作为 sqlplus 命令输入命令,您可以使用 <<input 重定向直到找到一个单词(在此修改后的代码中为 END):

sqlplus -s user/password <<END
set colsep '    '
set linesize 32000
set echo off
set feedback off
set trimspool on
set newpage 0
set pagesize 0
spool c:\temp\suggmoves.txt
select * from suggestive_moves;
spool off
quit
exit
END

END 字必须在行首(无缩进)。

Sqlplus 有一个批处理模式,使用 sql 命令脚本作为输入,而不是使用直接命令输入重定向。

【讨论】:

以上是关于批处理文件执行问题(CALL 不起作用)的主要内容,如果未能解决你的问题,请参考以下文章

echo 变量在批处理文件中不起作用

带有goto命令的Windows批处理文件不起作用

批处理文件命令 PAUSE 不起作用

为啥将命令输出定向到变量在批处理文件中不起作用

批处理文件集变量不起作用[重复]

批处理文件 If 语句导致 CMD 关闭且不起作用