0

我对 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

我也得到了一个整数值

4

1 回答 1

2

SET为什么和之间有这么大的差距rowcount?

就其本身而言,这无关紧要-但我怀疑您将它们放在不同的行上。

Theset rowcount=%%a必须与do- 位于同一物理行,并且 thedo必须与 the 之后的右括号位于同一物理行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将分配的值解释为数字字符串,这应该克服分配中的任何杂散空格。
  • ECHO在分隔符内 添加行数以提高可见性
  • 添加了 PAUSE 以在您有机会看到结果之前停止程序关闭。

评论 : 可能"delims="不是必需的,但是当问题被解决时我们会解决这个问题。

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

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

尝试解决令人费解的结果的进一步更改:

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

当然很奇怪....

于 2013-05-09T14:53:24.393 回答