Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 批处理:检查批处理文件中的命令行参数_Loops_Batch File_Parameters_Cmd - Fatal编程技术网

Loops 批处理:检查批处理文件中的命令行参数

Loops 批处理:检查批处理文件中的命令行参数,loops,batch-file,parameters,cmd,Loops,Batch File,Parameters,Cmd,我想根据传入的命令行参数在DOS批处理文件中执行一些操作。 应使用任意数量的参数调用批次。可能的参数应为(在最佳情况下可扩展): 此外,还可以按任何顺序输入参数。 尤其是param-verbose很有意思:如果给定此参数,则以下“parameterParam”必须是outputfilename的名称,或者可以为空。请注意,参数前面有一个“-”。参数参数的参数没有前导“-”, 例如: UPDATE -verbose -validate 应在标准输出上显示执行步骤(-verbose)并验证输入 U

我想根据传入的命令行参数在DOS批处理文件中执行一些操作。
应使用任意数量的参数调用批次。可能的参数应为(在最佳情况下可扩展):

此外,还可以按任何顺序输入参数。 尤其是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命令是有效的。