我有以下目录结构:
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 :(得分: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