变量在这个时候出人意料

时间:2013-05-09 14:41:49

标签: batch-file sqlplus

我对BAT文件不是很熟悉,但我有一个运行sqlplus查询的文件,返回行数,如果它大于0,则运行另一个bat文件。我觉得我差不多了,但我一直收到这个错误:

%% a此时出乎意料

@echo off
for /f "delims=" %%a in (
 'sqlplus USER/PASS@OMP1 @VoiceBlockTrig.SQL'
) do set rowcount=%%a
if %ROWCOUNT% GTR 0 (
c:\SQLTRIGGERS\VoiceBlkAutoationBAT.bat
)

当我运行上述内容时,我将此作为响应:

@echo off
for /f "delims=" %%a in (    
%%a was unexpected at this time
 'sqlplus USER/PASS@OMP1 @VoiceBlockTrig.SQL'
''sqlplus' is not recognized as an internal or external command, operable program or batch file
) do set rowcount=%%a
if %ROWCOUNT% GTR 0 (
More? c:\SQLTRIGGERS\VoiceBlkAutoationBAT.bat
More?

当我运行时:

sqlplus user/pass@P1 @VoiceBlockTrig.SQL

我也得到一个整数值

1 个答案:

答案 0 :(得分:2)

为什么SETrowcount?

之间存在这样的差距

就其本身而言,无论如何 - 但我怀疑你是分开的。

set rowcount=%%a必须与do位于同一物理线上 - 且do必须与in后的右括号位于同一物理线上

for /f "delims=" %%a in (
 'sqlplus user/pass@P1 @VoiceBlockTrig.SQL'
) do set rowcount=%%a

如果完全合法。


作为.bat文件:

:: @echo off
echo starting SQLPLUS
sqlplus USER/PASS@OMP1 @VoiceBlockTrig.SQL
echo finished SQLPLUS

for /f "delims=" %%a in (
 'sqlplus USER/PASS@OMP1 @VoiceBlockTrig.SQL'
) do ECHO(+%%a+&set /A rowcount=%%a

ECHO rowcount=+%rowcount%+

if %ROWCOUNT% GTR 0 (
c:\SQLTRIGGERS\VoiceBlkAutoationBAT.bat
)

PAUSE

这是一个看起来接近您需要运行的批次。

变化是:

  • ECHO(+%%a+循环中添加FOR
    • ECHO之后的开括号只是一个被发现比SPACE更好的字符,用于将ECHO与要回显的文本分开
    • %% a之前和之后的+只是用字符串分隔字符串 明显的特征,以便更容易观察到SPACES的存在。
  • SET更改为SET /A,它将指定的值解释为a numeric-string,它应该克服任何杂散空间 分配
  • 在分隔符中添加了行数的ECHO以提高可见性
  • 添加PAUSE以在您有机会看到结果之前停止程序关闭。

评论:可能"delims="可能不是必需的,但是当问题被打败时我们会谈到它。

评论:您的脚本需要两个ENTER的报告可能意味着SQLPLUS要求输入。如果是这样,'ECHO.^|sqlplus...可以缓解这个问题。

如果SQLPLUS是BATCH,则需要采用不同的方法。

进一步改变以试图解决困惑的结果:

  • @echo off之前的双冒号 - 双冒号通常用作 评论。目的是显示正在执行的行。
  • 独立添加SQLPLUS命令 - 观察结果。
  • 添加了两条ECHO线以显示进度。

当然很奇怪....