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


33

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


1
당신이 할 정말 DOS 호환 할 필요하거나 PowerShell을 사용할 수 있습니까?
Brian Knoblauch

1
당신은 또한 이것을 위해 아주 쉽게 vbscript를 사용할 수 있습니다 ...
JNK

@Brian : DOS가 필요합니다. 내가 게시 한 솔루션을 확인하십시오.
Jim Fell

머리카락이 없다면 명령 프롬프트와 DOS의 차이점을 확실히 알아야합니다.
barlop

답변:


48

나는 그것을 알아:

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, 나는 바퀴를 재발 명하는 것을 싫어한다.) 이제 여기에 게시되었으므로 다른 사람들도 유용하게 사용할 수 있기를 바랍니다.


1
글쎄, 난 네가 그렇게 할 줄 몰랐어! 나는 그것을 시도하고 작동합니다!
Linker3000

이것은 DOS에서 작동하지 않을 수 있습니다. DOS는 긴 파일 이름을 사용하지 않으며 (8.3 만), 기억 하듯이 DOS는 파일 경로에서도 따옴표를 사용하지 않습니다. ()구문을 사용하여 배열을 지원하는지 확인하는 편리한 MS-DOS 설치가 없습니다 .
CVn

3
이것은 귀하의 목적을 위해 작동하지만 실제로는 배열이 아닙니다. 개별 요소로 분리되는 문자열입니다. 와 같은 방법으로 요소를 직접 참조 할 수 없습니다 FILE_LIST[0].
aphoria

@ MichaelKjörling : FreeDOS 는 LFN 과 따옴표를 지원할 수 있습니다 .
Nathan Tuggy

@NathanTuggy 좋은 지적입니다. 그럼에도 불구하고 명시적인 경우에는 더 낫습니다.
CVn

12

예, 배치로 배열을 수행 할 수 있습니다. 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

1
그 .. 멋진과 inspring입니다 난 그냥 배열도 그 기반으로하고 웁니다 대답을 한 적이
barlop

7

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%.

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

영상


1
ok. 비록 배열이 너무 길지만 array.bat의 내용을 나열하지 않았지만
barlop

4

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

이름을 써서 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]!
)

0

당신이하고 싶은 일을 위해, 각 파일 이름에 대해 입력 변수를 사용하는 방법에 대해, % 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

0

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

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

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


for / f는 실제로 Windows 2000 이상의 기능입니다. DOS에는 없습니다.
wendy.krieger

0

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

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

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


0

텍스트에서 문자열과 문자를 바꾸십시오.

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
)

0

배치 파일에서 이와 같은 것? 폴더에서 파일을 선택하십시오. <<는 주석이며 코드는 없습니다.

: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

0

명령 프롬프트에서 실제로 배열을 수행 할 수 없으며 Windows 3.1을 실행하지 않으면 실제로 DOS가 아닙니다. 그러나 FOR 명령 으로 세트 기반 처리를 수행 할 수 있습니다 .

처리 할 파일 목록을 작성하려면 처리 할 텍스트 파일을 수동으로 작성하거나 dir /b <mask>FOR 루프 내에서 명령을 사용할 수 있습니다 .

FOR와 함께 어려운 방법을 배웠습니다. 커서로 SINGLE CHARACTER 변수 를 사용해야합니다 !


+1 당신은 downvote가 설명되어야한다고 언급합니다. 또한 "SINGLE CHARACTER 변수를 커서로 사용해야합니다!" <-당신은 커서가 아닌 인덱스를 의미합니다
barlop

1
또한 Win9X 부팅 디스크 인 경우 DOS (DOS 7)입니다. 그리고 Windows 9X는 여전히 DOS에서 실행된다고합니다. 그리고 bootscan = 0 및 bootgui = 0과 같이 msdos.sys라고 생각하는 줄을 추가하여 Windows 부팅을 중지하고 DOS 프롬프트로 바로 부팅 할 수 있습니다.
barlop

0

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

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

0

이것은 BATCH / CMD의 틱택 견인 게임에서 어레이를 테스트하기 위해 잠시 동안 만든 작은 디버그 파일입니다. 코드에서 크고 복잡하게 진행되는 배열 whitout에서 읽고 쓸 수 있습니다.

그것을 사용하는 것은 간단합니다 :

배열에 쓰기

  1. 다른 파일을 가져 오도록 파일을 제공하거나 수정하십시오.
  2. 배열에 이름을 지정하십시오.
  3. 그리고 당신의 일.

배열에서 읽기

  1. 읽어야 할 배열 또는 배열의 크기를 지정하십시오.
  2. 이름에 %% a를 사용하여 배열의 이름을 입력하십시오.
  3. 그리고 당신의 일.

암호:

@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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.