Loops 批处理:检查批处理文件中的命令行参数
我想根据传入的命令行参数在DOS批处理文件中执行一些操作。Loops 批处理:检查批处理文件中的命令行参数,loops,batch-file,parameters,cmd,Loops,Batch File,Parameters,Cmd,我想根据传入的命令行参数在DOS批处理文件中执行一些操作。 应使用任意数量的参数调用批次。可能的参数应为(在最佳情况下可扩展): 此外,还可以按任何顺序输入参数。 尤其是param-verbose很有意思:如果给定此参数,则以下“parameterParam”必须是outputfilename的名称,或者可以为空。请注意,参数前面有一个“-”。参数参数的参数没有前导“-”, 例如: UPDATE -verbose -validate 应在标准输出上显示执行步骤(-verbose)并验证输入 U
应使用任意数量的参数调用批次。可能的参数应为(在最佳情况下可扩展): 此外,还可以按任何顺序输入参数。 尤其是param-verbose很有意思:如果给定此参数,则以下“parameterParam”必须是outputfilename的名称,或者可以为空。请注意,参数前面有一个“-”。参数参数的参数没有前导“-”,
例如:
UPDATE -verbose -validate
应在标准输出上显示执行步骤(-verbose)并验证输入
UPDATE -verbose outputFileName.txt -validate
UPDATE -validate
UPDATE -validate -verbose
应将执行步骤记录到名为(-verbose outputFileName.txt)的文件中,并验证输入
UPDATE -verbose outputFileName.txt -validate
UPDATE -validate
UPDATE -validate -verbose
应仅验证输入
UPDATE -verbose outputFileName.txt -validate
UPDATE -validate
UPDATE -validate -verbose
我也应该这样做
UPDATE -verbose -validate
应显示如何使用update.bat
我该怎么做?使用FOR循环迭代命令行参数?但是怎么做呢?我可以迭代参数,但如果找到-verbose,我如何预览以下参数以检查是否提供了文件名
根据提供的参数,应执行特定操作(启动不同批次…)
我想通过java调用LiquiBase:
验证:
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-update.xml --logLevel=info validate
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-views-and-sp.xml --logLevel=info validate
对于脱机SQL生成:
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-update.xml --logLevel=info updateSQL > update_%_outputfilename%
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-views-and-sp.xml --logLevel=info updateSQL > viewsAndSP_%_outputfilename%
参数的顺序不是必需的。不确定可扩展性如何,但参数检查代码总是冗长的,即使在“严肃”的编程语言上也是如此。我终于明白了。以下是我基于Npcmaka有用代码的解决方案:
call _set-env.bat
@echo off
setlocal enableDelayedExpansion
set argC=0
for %%x in (%*) do Set /A argC+=1
set "_verbose=no"
set "_validate=no"
set "_outputfilename="
set "_check_next=no"
set "_sandbox=no"
if "%~1" equ "/?" goto :help
if %argC% == 1 (
if "%~1" equ "-sandbox" (
echo.
echo Running UPDATE with just -sandbox option does not do anything.
echo Run UPDATE /? for usage.
:: call :help
goto :eof
)
)
for %%a in (%*) do (
if "!_check_next!" equ "yes" (
set "_check_next=no"
set "arg=%%~a"
if "!arg:~0,1!" neq "-" (
set "_outputfilename=%%~a"
) else (
if "%%~a" equ "-validate" (
set "_validate=yes"
)
)
)
if "%%~a" equ "-verbose" (
set "_check_next=yes"
set "_verbose=yes"
)
if "%%~a" equ "-validate" (
set "_validate=yes"
)
if "%%~a" equ "-sandbox" (
set "_sandbox=yes"
)
)
if %_validate% equ yes (
call :validateUpdate
echo !errorlevel!
if !errorlevel! neq 0 exit /b !errorlevel!
)
if "yes" equ "%_verbose%" (
if "%_outputfilename%" neq "" (
call :verboseUpdateToFile
) else (
call :verboseUpdate
)
if !errorlevel! neq 0 exit /b !errorlevel!
)
if "no" equ "%_sandbox%" (
call :update
)
:: echo --%_validate%--%_verbose%--%_outputfilename%--
exit /b 0
:help
::echo %~0 [-verbose [outputFileName]] [-validate] [/?]
@echo Executes LiquiBase changesets to take effect on the database.
@echo.
@echo UPDATE [-verbose [outputFileName]] [-validate] [/?]
@echo. /? Shows this help.
@echo -validate Validates the changesets without executing them.
@echo -verbose Prints output of the generated SQL without executing them
@echo.
goto :eof
:validateUpdate
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-update.xml --logLevel=info validate
:: java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-views-and-sp.xml --logLevel=info validate
goto :eof
:verboseUpdate
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-update.xml --logLevel=info updateSQL
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-views-and-sp.xml --logLevel=info updateSQL
goto :eof
:verboseUpdateToFile
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-update.xml --logLevel=info updateSQL > update_"%_outputfilename%"
java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-views-and-sp.xml --logLevel=info updateSQL > viewsAndSP_"%_outputfilename%"
goto :eof
:update
@echo update...
rem java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-update.xml --logLevel=info update
rem java -jar %LIQUIBASE_EXEC% --changeLogFile=../changesets/changelog-views-and-sp.xml --logLevel=info update
endlocal
exit /b 0
有一点尚不清楚:
假设:执行validateUpdate并发生验证错误,LiquiBase打印“LiquiBase'validate'successful”,错误级别为0。这是因为LiquiBase打印出发生了验证错误,但它本身以0退出,因此ERRORLEVEL为0吗?
这意味着我无论如何都无法处理此类验证错误。
我打算在label:update处运行代码,只有在没有错误发生时才更新。您真的在使用DOS吗?或者
cmd.exe
?我有一个名为update.bat的文件,我想让它在命令行工具中的Windows计算机上运行。然后那将是cmd.exe
,我将更改标记。这不是一个好的设计,因为文件名可以以-
开头。您应该添加一个附加的-output
选项,该选项带有一个必需的文件名参数:UPDATE[-verbose][-validate][-output-file]
请查看。除了需要我之前评论中的-output outFile
选项,以及帮助选项将是-?
而不是/?
。这样我就可以获得有关ECHO的消息。。。回声[开|关]。我怎样才能避免这种情况?您的解决方案填充了一些变量。我如何使用它们?我想根据参数调用相应的程序。我可以在循环中调用一个标签,比如:prog1,然后在执行之后循环继续吗?或者我必须在循环检查变量值后加入一些IFs,然后启动程序?它对我不起作用。@du我无法根据参数知道你要调用什么程序,因为没有提供这些信息。是的,最好检查变量并调用你想要的程序。请提供更多信息,因为您的问题范围仅涉及耕地面积。请参阅我的扩展问题。在没有任何命令行命令的情况下运行java命令是有效的。