Windows批处理:如何编写嵌套的for循环?

时间:2017-05-15 12:36:09

标签: windows batch-file jenkins

我有以下目录结构:

WebERP
  --DDL
    --file1.sql
    --file2.sql
  --DML
    --file1.sql
    --file2.sql
WebERP_Finance
  --DDL
    --file1.sql
    --file2.sql
  --DML
    --file1.sql
    --file2.sql
.
.
.
file7.sql
file9.sql

DML和DDL文件夹下的文件现在称为fileN.sql,但将来它们的名称会有所不同。

我想遍历所有以" WebER *"开头的文件夹,并使用DDL和DML文件夹下的每个sql文件运行命令,但我不想要在file7.sql和file9.sql上运行的命令。

我尝试做一些嵌套for循环,但无济于事。

以下是我尝试的内容:

for /d %%R in (WebER*) do (
    for /r %%F (*.sql) do
       java -jar %liquibasejar% --changeLogFile=%workspace%\\SQL_Changes\\%%R\\DDL\\%%F update 
    )

我得到的错误是:r was unexpected at this time.

编辑#1: 当这个阶段正在运行时:

stage ('Run SQL scripts') {
                    bat """
                        set liquibasejar="c:\\Program Files (x86)\\LiquiBase\\liquibase.jar"
                        set sqljdbc="C:\\Program Files (x86)\\liquibase\\sqljdbc.jar"
                        set url="jdbc:sqlserver://localhost:1433;databaseName"
                        set driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"                   

                        cd %WORKSPACE%\\SQL_Changes
                        for /d %%R in (WebER*) do (
                            for /r "%%R" %%F in (*.sql) do (
                                echo "F: %%F"
                                java -jar %liquibasejar% --classpath=%sqljdbc% --url=%url%=%%R --driver=%driver% --username=%sql_user% --password=%sql_passwd% --changeLogFile=%workspace%\\SQL_Changes\\%%R\\DDL\\%%F update
                                java -jar %liquibasejar% --classpath=%sqljdbc% --url=%url%=%%R --driver=%driver% --username=%sql_user% --password=%sql_passwd% --changeLogFile=%workspace%\\SQL_Changes\\%%R\\DML\\%%F update
                            )
                        )
                    """

                }

这是詹金斯的输出:

c:\jenkins\workspace\Ensure_database_mgmt\SQL_Changes>(for /R "%R" %F in (*.sql) do (
echo "F: %F"  
 java -jar "c:\Program Files (x86)\LiquiBase\liquibase.jar" --classpath="C:\Program Files (x86)\liquibase\sqljdbc.jar" --url="jdbc:sqlserver://localhost:1433;databaseName"=WebERP_Finance --driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"                   --username=**** --password=**** --changeLogFile=c:\jenkins\workspace\Ensure_database_mgmt\SQL_Changes\WebERP_Finance\DDL\%F update  
 java -jar "c:\Program Files (x86)\LiquiBase\liquibase.jar" --classpath="C:\Program Files (x86)\liquibase\sqljdbc.jar" --url="jdbc:sqlserver://localhost:1433;databaseName"=WebERP_Finance --driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"                   --username=**** --password=**** --changeLogFile=c:\jenkins\workspace\Ensure_database_mgmt\SQL_Changes\WebERP_Finance\DML\%F update 
) ) 
[Pipeline] }
[Pipeline] // stage

你可以看到最后一个" %% F"没有正确翻译......任何想法为什么?

1 个答案:

答案 0 :(得分:1)

你几乎拥有它。

批处理文件使用面向行的格式,因此每行中必须完成所有命令和分隔符。在您的情况下,第二个.N命令需要一个打开的括号,否则它是一个不完整的命令(显然,一个额外的关闭paren),你也忘记了list字。

但是,您的代码也存在逻辑错误。您需要指定第二个try { //Actions can be performed here } catch (RuntimeException ee) { if (ee.toString().contains("NoSuchElementException")) { //steps } } 将在首先由for选择的每个文件夹。这是通过额外的in命令完成的,因为当用户@Magoo指示时,for /r在起始文件夹是另一个for /d参数时无法工作。

pushd