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


1

나는 일괄 스크립팅의 세계에 익숙하지 않으므로 기본적인 질문으로 나타날 수있는 것을 용서하십시오. 나는 다른 직업을 배정 받으면서 배우고 있으며 가능한 한 자동화의 큰 지지자입니다. 여러 작업을 수행하는 여러 배치 파일이 있습니다. 이러한 각 파일에는 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"

WScript를 사용하여 배치 파일 이상으로 확장하는 것이 좋습니다. 이렇게하면 스크립트에 많은 고급 기능을 포함시킬 수 있습니다.
tumchaaditya

답변:


1
  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>
    

자세한 답변 감사합니다. 통과 할 수있는 시점을 이해하려고했습니다 %1. 내 이해는 이것이 사용자가 입력 한 값이라는 것입니다. 이것을 명확하게 설명하는 예제가 너무 많지 않았습니다. 두 번째로 다시 enableextensions와에 대한 자세한 이해가 없습니다 enabledelayedexpansion. 내 질문을 게시하기 전에 인용 한 예제를 읽었지만 파일 내에서 변수를 호출 할 때 사용하도록 언급 한 게시물을 보았 기 때문에 포함 시켰습니다.
PeanutsMonkey

내가 사용한 이유 start /waitsuperuser.com/questions/465985/
PeanutsMonkey

무슨 소리 야 unless they happen to have a for loop? 거의 모든 배치 파일에 for루프가 있으므로 동일한 변수 이름을 사용하여 문제가 발생할 수 있습니다. 많은 for루프 가있는 경우 이와 같은 문제를 어떻게 극복합니까 ?
PeanutsMonkey

다시 : %1당신은 가까이; %1배치 파일의 첫 번째 인수입니다 ( argv[1]C를 알고 있다면). 사용자가 명령 줄 또는 call다른 배치 파일 로 전달할 수 있습니다 . "% 1"자체는 전달하지 않습니다. 대상 배치 파일을 호출하고 호출에 전달할 데이터를 추가 한 다음 대상 배치 파일에서 %1해당 데이터에 액세스하는 데 사용 합니다. 당신은 할 수 특별히 두 번째 배치 파일에 첫 번째 파일의 (첫번째) 인수를 전달하기를 원한다면 다른 하나의 배치 파일에서 % 1을 통과,하지만 두 번째, 그것은 에 매핑되지 %1, 그것은있을 수 있습니다 %2또는 뭔가 그밖에.
Synetech

1
Re : start, startwinscp를 호출하는 데 사용해야 합니다. winscp는 계속 실행되지만 반환되는 별도의 프로그램이므로 배치 파일이 계속됩니다. 를 사용하여 start이를 호출 한 배치 파일은 프로세스 가 종료 될 때까지 대기합니다 (만드는 모든 창 포함). startwinscp를 호출하는 배치 파일에서는 사용해야 하지만 winscp를 호출하는 배치 파일을 호출하는 배치 파일에서는 사용 하지 않아야합니다. 첫 번째 배치 파일은 두 번째 배치 파일이 자동으로 완료 될 때까지 대기하기 때문에 시작 강제 실행을 사용하는 경우 두 번째 파일은 winscp가 끝날 때까지 기다린 다음 첫 번째 파일이 자동으로 일시 중지됩니다.
Synetech
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.