배치 파일을보다 효율적으로 중앙 집중화 할 수 있습니까? [닫은] 코드 줄을

나는 일괄 스크립팅의 세계에 익숙하지 않으므로 기본적인 질문으로 나타날 수있는 것을 용서하십시오. 나는 다른 직업을 배정 받으면서 배우고 있으며 가능한 한 자동화의 큰 지지자입니다. 여러 작업을 수행하는 여러 배치 파일이 있습니다. 이러한 각 파일에는 c : \ temp와 같은 하드 코드 된 경로가 있습니다. 배치 파일의 d : \ data 등 처음에는 배치 파일에서 호출 할 수있는 텍스트 파일로 옮겼습니다.

for /f "tokens=1,2 delims==" %%R in (config.txt) do (
if %%R==bdata set bdata=%%S
if %%R==cdata set cdata=%%S
)

config.txt 파일에는 다음 값이 포함됩니다

bdata=c:\temp
cdata=d:\data

새 변수를 만들어야 할 때마다 config.txt 파일과 config.bat 파일도 업데이트해야한다는 것을 깨달았습니다.

다음과 같이 모든 값을 config.bat 파일로 이동하기로 결정했습니다.

set bdata=c:\temp
set cdata=d:\data

그런 다음 하드 코드 된 경로가 아닌 변수를 호출하도록 기존의 각 배치 파일을 업데이트했습니다. 또한 config.bat를 제외한 각 배치 파일에 다음 코드 줄을 추가했습니다. config.bat 파일에 추가 된 유일한 줄은 @echo off입니다.

@echo off

setlocal enableextensions enabledelayedexpansion

call config.bat

그런 다음 모든 배치 파일을 순차적으로 호출하는 것을 중앙 집중화하는 다른 배치 파일이 있습니다. 이 배치 파일의 이름은 start.bat입니다. 내가 사용하는 이유 는 이전 start /waitdelete.bat실행 compress.bat이 끝날 기회 가 있었기 때문 입니다.

start /wait compress.bat
start /wait validate.bat
start /wait delete.bat

질문

  1. 이것이 가치를 집중시키는 가장 좋은 방법입니까, 그렇지 않은 경우 더 좋은 방법은 무엇입니까?
  2. setlocal enableextensions enabledelayedexpansion기존 배치 파일을 모두 지정해야 합니까?
  3. 모든 배치 파일에서 @echo를 해제해야합니까, 아니면 config.bat 파일만으로 충분합니까?
  4. start /wait여러 파일을 호출하는 가장 좋은 방법은? 상기 명령을 사용하여 한 배치 파일에서 다른 배치 파일로 값을 전달할 수 있습니까?
  5. 모든 배치 파일에는 이동, 삭제 등의 기능이 다르지만 %% a 또는 %% b를 사용하십시오. 괜찮습니까?

예를 들어

validate.bat파일은 코드가

for %%a in (%bdata%\*.*) do if "%%~xa" == "" move /Y "%bdata%\%%~xa" "%bdata%\%done%"

그리고 delete.bat file코드가

for %%a in (%bdata%\*.*) do if "%%~xa" == ".txt" del "%%a"


답변

  1. 나쁘지는 않지만 외부 배치 파일이 단순하면 코드를 기본 배치 파일에 서브 루틴으로 넣고 레이블을 호출 할 수 있습니다. 예를 들면 다음과 같습니다.

    These four files:
    
    ::main.bat:
    @echo off
    call compress.bat …
    call validate.bat …
    call delete.bat …
    
    ::compress.bat:
    @echo off
    7z a -tzip -mx9 -blah -blah %1.zip
    
    ::validate.bat:
    @echo off
    7z t %1.zip
    
    ::delete.bat:
    @echo off
    delete "%1"
    
    
    Become one:
    
    ::main.bat:
    @echo off
    
    :start
      call compress …
      call validate …
      call delete …
    goto :eof
    
    :compress
      7z a -tzip -mx9 -blah -blah %1.zip
    goto :eof
    
    :validate
      7z t %1.zip
    goto :eof
    
    :delete.bat
      delete "%1"
    goto :eof
    
  2. 당신 은 그들을 필요로 할 것입니다 enableextensions그리고 / 또는 enabledelayedexpansion당신이 그들을 사용하려고합니다. 배치 파일에 무엇을 가지고 있는지 모르지만 그렇지 않은 경우 제외시킬 수 있습니다.

  3. 당신은하지 않습니다 오프 에코집니다 또 다른 하나를 할 수있는 경우에 외부 배치 파일을 사용할 수 있지만, 특히 당신이로 부를 수있는 배치 파일, 표준 헤더로 포함하는 그냥 좋은 습관 자체적으로 (예 : compress.bat명령 프롬프트에서 수동으로 호출 ) 특별히 포함하고 싶지 않은 시나리오는 거의 없습니다.

  4. 당신은 할 수 있습니다 사용 start /wait하지만, 단순히 기본적으로 반환하는 외부 파일이 자동으로 대기 호출, 그래서 필요는 없습니다. 일} 처리 파일에서 GUI 프로그램을 호출 할 때이를 사용하려고합니다. 또한 호출 start하면 인수를 대상 프로그램에 전달 call하는 것 보다 인수를 전달 하는 것이 더 복잡 합니다.

  5. 아마도 그럴 것입니다. 루프 매개 변수는 루프에 대해 로컬 for이므로 다른 배치 파일은 루프가없는 경우 for에도 루프 자체에서만 볼 수 있습니다.

    C:\t>type baz.bat
    @for %%a in (1) do call foobar.bat %%a
    
    C:\t>type foobar.bat
    @echo off
    echo %1
    echo %%a
    for %%a in (1) do echo %%a
    echo %%a
    
    C:\t>baz.bat
    
    C:\t>call foobar.bat 1
    1
    %a
    1
    %a
    
    C:\t>