나는 일괄 스크립팅의 세계에 익숙하지 않으므로 기본적인 질문으로 나타날 수있는 것을 용서하십시오. 나는 다른 직업을 배정 받으면서 배우고 있으며 가능한 한 자동화의 큰 지지자입니다. 여러 작업을 수행하는 여러 배치 파일이 있습니다. 이러한 각 파일에는 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 /wait
에 delete.bat
실행 compress.bat
이 끝날 기회 가 있었기 때문 입니다.
start /wait compress.bat
start /wait validate.bat
start /wait delete.bat
질문
- 이것이 가치를 집중시키는 가장 좋은 방법입니까, 그렇지 않은 경우 더 좋은 방법은 무엇입니까?
setlocal enableextensions enabledelayedexpansion
기존 배치 파일을 모두 지정해야 합니까?- 모든 배치 파일에서 @echo를 해제해야합니까, 아니면 config.bat 파일만으로 충분합니까?
- 가
start /wait
여러 파일을 호출하는 가장 좋은 방법은? 상기 명령을 사용하여 한 배치 파일에서 다른 배치 파일로 값을 전달할 수 있습니까? - 모든 배치 파일에는 이동, 삭제 등의 기능이 다르지만 %% 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"
답변
-
나쁘지는 않지만 외부 배치 파일이 단순하면 코드를 기본 배치 파일에 서브 루틴으로 넣고 레이블을 호출 할 수 있습니다. 예를 들면 다음과 같습니다.
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
-
당신 은 그들을 필요로 할 것입니다
enableextensions
그리고 / 또는enabledelayedexpansion
당신이 그들을 사용하려고합니다. 배치 파일에 무엇을 가지고 있는지 모르지만 그렇지 않은 경우 제외시킬 수 있습니다. -
당신은하지 않습니다 이 오프 에코집니다 또 다른 하나를 할 수있는 경우에 외부 배치 파일을 사용할 수 있지만, 특히 당신이로 부를 수있는 배치 파일, 표준 헤더로 포함하는 그냥 좋은 습관 자체적으로 (예 :
compress.bat
명령 프롬프트에서 수동으로 호출 ) 특별히 포함하고 싶지 않은 시나리오는 거의 없습니다. -
당신은 할 수 있습니다 사용
start /wait
하지만, 단순히 기본적으로 반환하는 외부 파일이 자동으로 대기 호출, 그래서 필요는 없습니다. 일} 처리 파일에서 GUI 프로그램을 호출 할 때이를 사용하려고합니다. 또한 호출start
하면 인수를 대상 프로그램에 전달call
하는 것 보다 인수를 전달 하는 것이 더 복잡 합니다. -
아마도 그럴 것입니다. 루프 매개 변수는 루프에 대해 로컬
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>