DOS 배치 스크립트에서 배열 채우기 DOS 배치 스크립트에서 배열 변수를

DOS 배치 스크립트에서 배열 변수를 어떻게 설정합니까? 처리 할 파일 이름 목록과 함께로드하고 싶습니다. 나는 이것을 가능한 한 간단하게 유지하고 싶습니다. 감사합니다.



답변

나는 그것을 알아:

set FILE_LIST=(file1.dll file2.exe file3.dll file4.dll file5.dll)

set BIN_PATH="C:\Program Files\My App Folder\bin"
set BAK_PATH="C:\Program Files\My App Folder\bin\Backups"
set DEV_PATH="C:\My Dev Path\bin\Debug"

for %%i in %FILE_LIST% do copy %BIN_PATH%\%%i %BAK_PATH%
for %%i in %FILE_LIST% do copy %DEV_PATH%\%%i %BIN_PATH%

나는 몇 년 전에 이와 같은 일을 했으므로 약간의 계산이 필요했습니다. (btw, 나는 바퀴를 재발 명하는 것을 싫어한다.) 이제 여기에 게시되었으므로 다른 사람들도 유용하게 사용할 수 있기를 바랍니다.


답변

예, 배치로 배열을 수행 할 수 있습니다. C 또는 VB의 배열과 정확히 같지는 않지만 다음과 같이 할 수 있습니다.

@echo off
setlocal enabledelayedexpansion

set  arrayline[0]=############
set  arrayline[1]=#..........#
set  arrayline[2]=#..........#
set  arrayline[3]=#..........#
set  arrayline[4]=#..........#
set  arrayline[5]=#..........#
set  arrayline[6]=#..........#
set  arrayline[7]=#..........#
set  arrayline[8]=#..........#
set  arrayline[9]=#..........#
set arrayline[10]=#..........#
set arrayline[11]=#..........#
set arrayline[12]=############

::read it using a FOR /L statement
for /l %%n in (0,1,12) do (
echo !arrayline[%%n]!
)
pause

답변

Jakash3의 블로그 에서 Batch의 Arrays 는 명령 프롬프트에서 배열을 에뮬레이트하는 방법을 설명합니다.

이 기사에는 array.bat라는 배치 파일이 포함되어 있으며 여기에는 배열을 처리하는 데 사용되는 함수 라이브러리가 포함되어 있습니다. 기사에서 텍스트를 선택하여 bat 파일에 붙여 넣어야합니다.

예를 들어 다음 테스트 스크립트는 다음과 같습니다.

@echo off
set book[0]=Avatar
set book[1]=The Green Mile
set book[2]=The Count of Monte Cristo
call array.bat add book Babo
call array.bat len book length
echo I have %length% books you can borrow.
echo Pick one:
echo.
echo 0) Avatar
echo 1) The Green Mile
echo 2) The Count of Monte Cristo
echo 3) Babo
echo.
set /p pick=
call array.bat getitem book %pick% title
echo.
echo You picked %title%.

다음과 같은 출력을 생성합니다.


답변

배열을 채우고 인쇄합니다.

이름을 써서 names [1] names [2] names [3] 대신 names1 names2 names3을 사용할 수 있습니다! 이름 대신 [! i!]. 변수 이름을 생성하여 배열을 생성합니다. 배치에 배열 구조가 없습니다. 그러나 배열 구조만큼이나 깔끔하며 채우기 또는 인쇄는 배열을 실제 언어로 배열하는 적절한 언어로 배열을 채우거나 인쇄하는 것과 정확히 같습니다.

@echo off
setlocal enabledelayedexpansion enableextensions

set i=-1

for %%f in (bob, tom, joseph) do (
 set /a i=!i!+1
 set names[!i!]=%%f
)
set lastindex=!i!

for /L %%f in (0,1,!lastindex!) do (
  echo !names[%%f]!
)

출력

c:\blah>a
bob
tom
joseph

c:\blah>

일부 설명

setlocal enabledelayedexpansion enableextensions대신! var에와! FOR 또는 IF 내에서 변수가 제대로 작동하려면 이상한 동작을 방지하기 위해 % var % 대신 % var %가 필요합니다. 배치 파일이 이상합니다. set /?그것이 더 언급 된 곳을 보십시오 .

이것이 배열을 채우는 배열이며 배열에 대해 잘 아는 사람에게는 매우 간단합니다. 당신은 또한 할 수있는 names[0]=bob names[1]=tom names[2]=joseph배열의 아름다움 중 하나가 내가 여기에 무슨 짓을했는지이다 루프, 배열을 채울 수있는 기능입니다하지만.

for %%f in (bob, tom, joseph) do (
 set /a i=!i!+1
 set names[!i!]=%%f
)
set lastindex=!i!

배열이 표시됩니다. %% f 반향하면 1 단계에서 0에서 배열의 마지막 색인으로 이동합니다. 따라서 이름 [0] 이름 [1] 이름 [2]을 인쇄합니다.

for /L %%f in (0,1,!lastindex!) do (
  echo !names[%%f]!
)

답변

당신이하고 싶은 일을 위해, 각 파일 이름에 대해 입력 변수를 사용하는 방법에 대해, % 1 % 2 등의 변수로 선택할 수 있습니다 : 예 : mybat.bat file1.nam file2.nam 등.

그런 다음 이러한 변수를 루프에서 사용할 수 있지만 SHIFT를 사용하여 다른 변수를 % 1 ‘위치’로 가져 와서 무언가를 null (변수 끝) 테스트하여 % 1을 기본 매개 변수로 사용하면됩니다. IF “X % 1″== “X”와 같은

예 :

:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE

답변

filelist.txt에 파일 목록을 저장하면 파일의 FOR각 줄을 읽고 처리 할 수 있습니다.

FOR /F "delims=|" %i  IN (filelist.txt) DO @echo %i

파일의 각 줄을 인쇄하려면 (줄의 첫 번째 “|”까지). 고유 한 구분 기호를 지정하지 않으면 공백과 탭이 사용되므로 경로에 공백이 없으면 문자를 지정해야합니다. 완전한 줄을 얻기 위해 파일에 나타나지 않습니다).


답변

당신이 한 대답에 대한 당신의 의견 중 하나에서,

개발 작업을하고 있으며 매번 응용 프로그램의 복잡한 특성으로 인해 빌드를 테스트하려고합니다 (종종) 빌드 바이너리 디렉토리에서 설치 바이너리 디렉토리로 5 개의 파일을 복사해야합니다. 지루해집니다. 지금은 파일 이름을 배치 스크립트로 하드 코딩했지만 스크립트를 유지 관리하기 쉽도록 파일 이름을 배열에 넣고 싶습니다.

나는 당신이 찾고있는 것이 Makefile이며, cygwin이 알맞은 껍질 (bash 또는 다른 풍미)을 줄 것이라고 생각합니다.