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, 나는 바퀴를 재발 명하는 것을 싫어한다.) 이제 여기에 게시되었으므로 다른 사람들도 유용하게 사용할 수 있기를 바랍니다.
()
구문을 사용하여 배열을 지원하는지 확인하는 편리한 MS-DOS 설치가 없습니다 .
FILE_LIST[0]
.
예, 배치로 배열을 수행 할 수 있습니다. 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
파일의 각 줄을 인쇄하려면 (줄의 첫 번째 "|"까지). 고유 한 구분 기호를 지정하지 않으면 공백과 탭이 사용되므로 경로에 공백이 없으면 문자를 지정해야합니다. 완전한 줄을 얻기 위해 파일에 나타나지 않습니다).
텍스트에서 문자열과 문자를 바꾸십시오.
for 본문으로 텍스트를 확장하고 var를 var로 대체하여 for 루프를 시도하십시오. set 명령을 호출하여 % 1이 (가) 사용자 입력이되도록 텍스트 파일을 끌어서 놓으십시오.
@echo off
setlocal EnableDelayedExpansion
set /p a= enter letter to change:
set /p b= letter to change to:
set /p input=<%1
for /f %%c in ("!input:~!") do (
set "code=!input:%a%=%b%!"
echo !code!>myfile.txt
)
배치 파일에서 이와 같은 것? 폴더에서 파일을 선택하십시오. <<는 주석이며 코드는 없습니다.
:selectapk
SETLOCAL ENABLEDELAYEDEXPANSION << DELAYED EXPANSION on for counter in For loop
SET /A MAXITEM=0
Echo.
Echo Found these APK files in "add_apk_here" folder.
Echo.
For %%a in (add_apk_here/*.apk) do (
Set /A MAXITEM+=1
Set MENUITEM!MAXITEM!=%%a << Fill n local env vars, one for each file, called MENUITEM1...n
Echo !MAXITEM!. %%a
)
Echo.
If !MAXITEM!==0 Echo No APK in "add_apk_here" folder & call :delay & Goto start << No apk files then go back
SET /P CHOICE=Select APK to work on:
SET MENUITEM=!MENUITEM%CHOICE%! << Get the stored filename from MENUITEMx
SETLOCAL DISABLEDELAYEDEXPANSION << Very important for next ENDLOCAL that doesn't like the delayedexpansion var
ENDLOCAL & SET apk=%MENUITEM% << put the local MENUITEM var into the global apk var
goto start
:delay
REM %1 like Call :delay 5
SETLOCAL
SET N=%1
If Not Defined N Set N=2
Ping -n %N% -w 1000 127.255.255.255 > nul
ENDLOCAL
Exit /b
명령 프롬프트에서 실제로 배열을 수행 할 수 없으며 Windows 3.1을 실행하지 않으면 실제로 DOS가 아닙니다. 그러나 FOR 명령 으로 세트 기반 처리를 수행 할 수 있습니다 .
처리 할 파일 목록을 작성하려면 처리 할 텍스트 파일을 수동으로 작성하거나 dir /b <mask>
FOR 루프 내에서 명령을 사용할 수 있습니다 .
FOR와 함께 어려운 방법을 배웠습니다. 커서로 SINGLE CHARACTER 변수 를 사용해야합니다 !
FOR batch 명령 에 대한 Microsoft 설명서를 확인하십시오 . FOR를 사용하여 디렉토리 세트, 디렉토리의 파일 또는 디렉토리 및 모든 서브 디렉토리의 파일을 반복 할 수 있습니다.
기본적으로 FOR는 세트 또는 파일 만 처리합니다.
FOR %f IN (*.txt) DO ECHO %f
또는 재귀 적 인 경우 :
FOR /R %f IN (*.txt) DO ECHO %f
또는 디렉토리의 경우 :
FOR /D %d DO ECHO %d
이것은 BATCH / CMD의 틱택 견인 게임에서 어레이를 테스트하기 위해 잠시 동안 만든 작은 디버그 파일입니다. 코드에서 크고 복잡하게 진행되는 배열 whitout에서 읽고 쓸 수 있습니다.
그것을 사용하는 것은 간단합니다 :
배열에 쓰기
배열에서 읽기
암호:
@echo off
setlocal EnableDelayedExpansion
set ID=0
:: Reader ::
:: It reads the file called input.txt ::
:: and stores it in a new variable that ::
:: for everytime it goes over it it is a ::
:: new ID (Slot in the array). ::
For /F %%A in (input.txt) do (
set /a ID=ID+1
set Input!ID!= %%A
echo !ID! : %%A
)
:: Writer ::
:: this is to read all Slots in the array ::
:: and puts it on the screen. ::
for /L %%a in (1,1,!ID!) do (
echo !Input%%a!
)
pause>nul