此时变量出乎意料

Posted

技术标签:

【中文标题】此时变量出乎意料【英文标题】:variable was unexpected at this time 【发布时间】:2013-05-09 14:41:48 【问题描述】:

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

为什么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

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

变化是:

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

评论:"delims=" 可能不是必需的,但我们会在解决问题后解决。

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

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

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

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

当然很奇怪....

【讨论】:

More? 提示和%%a was unexpected at this time 的位置正在说明。您需要使用文本编辑器将命令放入名为virtuallyanythingyoulike.bat 的批处理文件中,然后通过发出命令viruallyanythingyoulike 从提示符运行该文件。在批处理文件中,元变量 %%a 需要两个 % 符号。如果从提示符运行,您只需要使用一个。使用文件并对其进行编辑要容易得多,而不是不断地重新输入命令并调用所有这些拼写错误。 好的,我把上面的代码,粘贴到一个txt文件中,保存为.bat。双击它打开,但我得到的只是一个空白的 CMD 屏幕.....如果我在其中输入两次它就会关闭。 好的...尝试了您的新代码,但我得到的只是一个空白的 CMD 屏幕...现在我可以反复按 Enter 键,但似乎没有任何反应。

以上是关于此时变量出乎意料的主要内容,如果未能解决你的问题,请参考以下文章

批处理文件:(此时出乎意料

goto此时出乎意料

错误:“|”此时出乎意料的批处理脚本

转: Java并发编程之五:volatile变量修饰符—意料之外的问题(含代码)

今日所学1

Pyspark:\Anaconda3\envs\xgboost\python.exe] 此时出乎意料