2014-09-26 2 views
1

들어오는 명령 줄 매개 변수에 따라 DOS 배치 파일에서 일부 작업을 수행하려고합니다.
배치는 여러 매개 변수로 호출해야합니다. 가능한 매개 변수는 다음과 같습니다 (가능한 경우 확장 가능) :배치 : 배치 파일의 명령 줄 매개 변수 확인

UPDATE [-verbose [outputFileName]] [-validate] [/?] 

또한 임의의 순서로 매개 변수를 입력 할 수 있어야합니다. 특히 매개 변수 -verbose이 중요합니다.이 매개 변수를 지정하면 다음과 같은 'parameterParam'이 출력 파일 이름이어야하며 비워 둘 수 있습니다. 매개 변수에는 앞에 "-"가 붙습니다. 매개 변수 인수의 매개 변수에는 선행 "-"이 없습니다. 예
:

UPDATE -verbose -validate 

표준 출력 (-verbose)에 대한 실행 단계를 표시하고, 입력을 확인한다.

UPDATE -verbose outputFileName.txt -validate 

은 (outputFileName.txt -verbose) outputFilename.txt > <라는 파일에 실행 단계를 기록하고, 입력을 확인한다.

UPDATE -validate 

은 입력의 유효성 만 검사해야합니다.

UPDATE -validate -verbose 

UPDATE -verbose -validate 

으로 동일한 작업을 수행하여야한다.

UPDATE /? 

update.bat 사용하는 방법을 표시하여야한다

내가 어떻게 할 수 있습니까? 명령 줄 인수를 FOR 루프로 반복 하시겠습니까? 그러나 어떻게? 인수를 반복 할 수 있지만 -verbose가 발견되면 어떻게 파일 이름이 제공되는지 확인하기 위해 다음 매개 변수를 미리 볼 수 있습니까? 특정 작업이 수행해야 제공된 매개 변수에 따라

(다른 배치를 시작하는 ...) 내가 자바를 통해 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% 
+2

DOS를 사용하고 계십니까? 또는'cmd.exe'? – paxdiablo

+0

나는 update.bat라는 파일을 가지고 있으며 명령 줄 도구에서 Windows 컴퓨터에서 실행되도록하고 싶습니다. –

+0

그러면 cmd.exe가됩니다. 태그를 바꿀 것입니다. – paxdiablo

답변

1
@echo off 

setlocal enableDelayedExpansion 
set "_verbose=no" 
set "_validate=no" 
set "_outputfilename=" 
rem set "arg_counter=0" 
set "_check_next=no" 

if "%~1" equ "/?" call :help 

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

    rem if "%%~a" equ "/?" call :help 

    if "%%~a" equ "-verbose" (
     set "_check_next=yes" 
     set "_verbose=yes" 
    ) 

    if "%%~a" equ "-validate" (
     set "_validate=yes" 
    ) 

) 

echo --%_validate%--%_verbose%--%_outputfilename%-- 

endlocal 
exit /b 0 

:help 

    echo %~0 [-verbose [outputFileName]] [-validate] [/?] 
    echo some explanations 

exit /b 0 

의 순서 인수는 요청한대로 필수 항목이 아닙니다. 확장 성은 어느 정도인지는 모르겠지만 arg 검사 코드는 '심각한'프로그래밍 언어에서도 항상 장황합니다.

+0

이 방법은 에코에 관한 메시지를 얻습니다 ... 에코 [켜기 | 떨어져서]. 이 문제를 어떻게 방지 할 수 있습니까? 솔루션이 일부 변수를 채 웁니다. 어떻게 사용할 수 있습니까? 매개 변수에 따라 각각의 프로그램을 호출하려고합니다. 루프 내에서 prog1과 같은 레이블을 호출 할 수 있습니까? 실행 후 루프가 계속됩니까? 또는 변수 값을 확인하고 프로그램을 시작한 후 일부 IF를 넣어야합니까? 그것은 나를 위해 작동하지 않습니다. –

+0

@ du-it이 정보가 제공되지 않았기 때문에 매개 변수에 따라 어떤 프로그램을 호출할지 알 수있는 방법이 없습니다. 그렇습니다. 변수를 확인하고 원하는 프로그램을 호출하는 것이 가장 좋습니다. Betrer는 귀하의 질문의 범위가 agruments 파싱에만 관련되어 있기 때문에 더 많은 정보를 제공합니다 – npocmaka

+0

내 확장 질문을 참조하십시오. 명령 줄 명령없이 java 명령을 실행하면 작동합니다. –

1

드디어 받으러 왔습니다. 의가 있다고 가정 해 봅시다 : validateUpdate가 실행되고 유효성 검사 오류가 발생, LiquiBase가 "Liquibase '검증'성공"과 ERRORLEVEL을 출력

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 

한 것은 아직 확실하지 않다 : 여기 내 솔루션은 npocmaka의 유용한 코드 기반으로 0입니다.이것은 LiquiBase가 유효성 검사 오류가 발생했음을 출력하지만 0으로 자체를 종료하므로 ERRORLEVEL이 0이기 때문에입니까? 이것은 어쨌든 그러한 유효성 검사 오류를 처리 할 수 ​​없다는 것을 의미합니다. 오류가 발생하지 않는 경우에만 label : update에서 코드를 실행하려고했습니다.

관련 문제