Windows批处理循环子例程和局部变量

时间:2015-12-31 01:54:51

标签: windows batch-file

在工作中,我们使用Windows批处理文件从计划工具中运行作业。这是一个古老的工具和方法,但它的工作原理。我必须使新工作适合现有技术。

对于这项特殊工作,我需要从文件夹中获取大量文件并将它们加载到SQL Server数据库表中。对于我加载的每一个,我需要运行一些SQL来更新最近填充的表。

所以我有一个for循环来查找文件夹中的文件。如果存在,我使用SQL服务器的BCP将数据加载到表中。然后我使用SQL服务器的SQLCMD来执行更新。

策略是使用BCP或SQLCMD将任何问题写入文件。接到电话后,我们会检查这些文件以确保没有出错。

处理单个文件时,这是相当简单的事情。事实证明,使用FOR循环是不可能的。

我设想调用一个子例程来设置一个变量,for循环中的代码可以检查,如果适当的话,优先退出。

我们在批处理文件中做的第一件事是将全局变量设置为0.当批处理作业将控制权返回给“调度程序”时,如果这不等于0,则作业显示为失败。

所以解释代码看起来像下面这样。

SET g_status=0
SET LOCAL EnableDelayedExpansion
FOR n = 1 to 12
   IF FILE(n) EXISTS (
      Execute BCP....
      Execute SQLCMD....
      CALL check_sql_status
      IF !l_error_status! NEQ 0 ENDLOCAL & SET g_status=!l_error_status!
      IF g_status NEQ 0 GOTO exit_gracefully
      )
NEXT
.
.
GOTO END
REM ========
:check_sql_status
REM======
IF something is wrong (
   SET l_error_status=123

GOTO EOF

REM ========
:exit_gracefully
REM======
ECHO g_status

:End
.
.

不要挂在上面的'代码'上。它只是我尝试将局部变量传递回我感兴趣的全局变量的位。无论我尝试什么,我都无法使全局变量接受子例程中设置的值。

我会尝试找到这个问题并在我恢复工作时发布一些实际代码,尽管BCP和SQLCMD使用了许多可能只是混淆而不是帮助的参数。

0 个答案:

没有答案