2017-05-15 3 views
0

Ich habe die folgende Verzeichnisstruktur:Windows-Batch: Wie schreibe ich eine verschachtelte For-Schleife?

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 

Die Dateien unter DML und DDL-Ordner werden jetzt wird fileN.sql aber in Zukunft ihren Namen anders sein genannt.

Ich möchte alle Ordner durchlaufen, die mit "WebER *" beginnen, und einen Befehl mit jeder der SQL-Dateien unter DDL und DML-Ordner ausführen, aber ich möchte nicht, dass der Befehl auf file7 ausgeführt wird. sql und file9.sql.

Ich habe versucht, einige verschachtelte For-Schleife, aber ohne Erfolg.

Hier ist, was ich versucht habe:

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

Der Fehler, den ich bekommen ist: r was unexpected at this time.

Edit # 1: Wenn diese Phase läuft:

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 
          ) 
         ) 
        """ 

       } 

Das ist die Ausgabe von Jenkins:

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 

Sie können sehen, dass die letzte "%% F" nicht richtig übersetzt ... eine Idee warum?

+0

[Diese Frage] (https://stackoverflow.com/questions/43945084/deleting-folders-recursively-using-windows-batch-script/43945671) erscheint einige Ähnlichkeiten zu haben, die Ihnen nützlich sein können . –

Antwort

1

Sie haben es fast schon.

Batch-Dateien verwenden das zeilenorientierte Format, so dass alle Befehle und Trennzeichen in jeder Zeile vollständig sein müssen. In Ihrem Fall benötigt der zweite for Befehl eine offene Klammer, sonst ist es ein unvollständiger Befehl (und natürlich, ein zusätzlicher schließender), und Sie haben auch das in Wort vergessen.

Ihr Code hat jedoch auch einen logischen Fehler. Sie müssen angeben, dass der zweite for /rinnerhalb jeder der Ordner funktioniert, die zuerst von for /d ausgewählt werden. Dies geschieht über einen zusätzlichen Befehl pushd, da, wie Benutzer @Magoo angibt, for /R nicht funktionieren kann, wenn der Startordner ein anderer for Parameter ist.

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

Traurigerweise mag 'for/r' keine Variable als Start-Verzeichnisname. PUSHD/POPD erforderlich ... – Magoo

+0

@Magoo: Danke! fixed ... ** ':)' ** – Aacini

+0

Danke für deine Antwort, bitte überprüfe Edit # 1. –

Verwandte Themen