2017-05-15 140 views
0

我有以下目录结构:Windows批处理:如何编写一个嵌套for循环?

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”没有正确的翻译......任何想法为什么?

+0

[这个问题](https://stackoverflow.com/questions/43945084/deleting-folders-recursively-using-windows-batch-script/43945671)似乎有一定的相似之处,可能会对你有所帮助。 –

回答

1

你几乎拥有它。

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

但是,您的代码也有逻辑错误。您需要指定第二个for /r将工作里面的每个由第一个for /d选择的文件夹。这是通过额外的pushd命令完成的,因为用户@Magoo指示,当起始文件夹是另一个for参数时,for /R无法工作。

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

不幸的是,'for/r'不喜欢一个变量作为start-directoryname。 PUSHD/POPD需要... – Magoo

+0

@Magoo:谢谢!固定... **':)'** – Aacini

+0

感谢您的回答,请检查编辑#1。 –