DOS Toplu İş Komut Dosyasında Dizi Doldurma


33

DOS toplu iş komut dosyasında bir dizi değişkenini nasıl ayarlayabilirim? İşlenecek dosya adlarının bir listesini yüklemek istiyorum. Bunu olabildiğince basit tutmak istiyorum. Teşekkür ederim.


1
Gerçekten DOS uyumlu olmanız gerekiyor yoksa PowerShell'i kullanabilir misiniz?
Brian Knoblauch

1
Ayrıca bunun için vbscript'i kolayca kullanabilirsiniz ...
JNK

@Brian: DOS gereklidir. Gönderdiğim çözümü inceleyin.
Jim

Eğer saçınız yoksa, komut
istemiyle

Yanıtlar:


48

Bunu anladım:

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%

Birkaç yıl önce böyle bir şey yaptım, bu yüzden sadece biraz anladım. (btw, tekerleği yeniden icat etmekten nefret ediyorum.) Şimdi buraya gönderildi, umarım başkaları da onu yararlı bulacaktır.


1
Bunu yapabileceğini hiç bilmiyordum! Denedim ve işe yarıyor!
Linker3000

Bu muhtemelen DOS'ta çalışamaz. DOS uzun dosya adları yapmaz (yalnızca 8.3) ve hatırladığım kadarıyla DOS dosya yollarında da tırnak işareti yapmaz. Bir ()sözdizimi kullanarak dizileri destekleyip desteklemediğini görmek için kullanışlı bir MS-DOS yüklemesi yok .
CVn

3
Bu sizin amacınıza uygun olsa da, bunun gerçekten bir dizi olmadığı unutulmamalıdır. Bu, tek tek öğelere bölünen bir dizedir. Öğeleri doğrudan gibi bir şey yaparak doğrudan referans veremezsiniz FILE_LIST[0].
aforria

@ MichaelKjörling: FreeDOS , LFN'leri ve muhtemelen alıntıları destekleyebilir , bu yüzden belki de kullanıyordur?
Nathan Tuggy

@ NathanTuggy İyi nokta. Yine de, bu durum açıkça yapılsaydı daha iyi olurdu.
4:15 CVn

12

Evet, toplu iş için dizileri yapabilirsiniz. Tam olarak C veya VB'deki diziler gibi olmasalar da, bunu yapabilirsiniz:

@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
Bu harika ve
ilham verici

7

Jakash3'ün Blog'undan Batch'taki Diziler , komut isteminde dizilerin nasıl taklit edileceğini açıklar.

Dizide işlemek için kullanılan bir işlev kütüphanesi içeren makalede array.bat adlı bir toplu iş dosyası bulunur. Makaledeki metni seçmeniz ve yarasa dosyasının içine yapıştırmanız gerekir.

Örneğin, aşağıdaki test komut dosyası:

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

aşağıdaki çıktıyı üretir:

görüntü


1
Tamam, dizi.bat içeriğini listelememiş olsanız da, biraz uzun olduğunu
görsem de

4

Bu bir diziyi doldurur ve yazdırır

İsimleri [1] isimleri [2] isimleri [3] yerine isimleri1 isimleri2 isimleri3 kullanabilirsiniz! isimleri yerine [! i!]. Değişken isimleri oluşturarak diziyi üretir. Toplu iş içinde bir dizi yapısı yok. Ancak, herhangi bir dizi yapısı kadar temizdir ve doldurma veya yazdırma tam olarak bir dizinin uygun bir dilde nasıl doldurulacağı veya yazdırılacağı gibi görünür (aslında dizi yapısına sahip!)

@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]!
)

çıktı-

c:\blah>a
bob
tom
joseph

c:\blah>

Bazı açıklamalar-

setlocal enabledelayedexpansion enableextensions! Var olan! garip davranışı önlemek için% var% yerine, değişkenlerin bir FOR ya da IF içinde uygun şekilde davranması gerekir. Toplu iş dosyaları ile garip bir durum. Bunun set /?daha fazla belirtildiği yere bakın .

Diziyi dolduran şey budur ve dizileri bilen herhangi birisine oldukça açıktır. names[0]=bob names[1]=tom names[2]=josephBir dizinin en güzel yanlarından biri, burada yaptığım işte bir diziyi döngü ile doldurma yeteneği olsa da yapabilirsiniz .

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

Bu diziyi görüntüler. %% f, görürseniz göreceğiniz dizide 0'dan dizinin son dizinine gidersiniz, 1. adımda. Böylece isimler [0] isimler [1] isimler [2]

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

0

Ne yapmak istediğinize göre,% 1% 2 vs. değişkenleriyle alabileceğiniz her dosya adı için bir giriş değişkeni kullanmaya ne dersiniz, örneğin: mybat.bat file1.nam file2.nam etc ..

Daha sonra bu değişkenleri bir döngüde kullanabilirsiniz, ancak diğer değişkenleri% 1 'pozisyonuna getirmek için SHIFT'i kullanabildiğiniz için ana parametre olarak% 1 kullanmanız gerekir, bunun için null (değişkenlerin sonu) sınaması yapılır. IF "X% 1" == "X" gibi

Örneğin:

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

0

Dosya listesini filelist.txt FORdosyasına kaydederseniz, dosyanın her satırını okuyabilir ve işleyebilirsiniz.

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

Bir dosyanın her satırını yazdırmak için (satırdaki ilk "|" e kadar. Kendi sınırlayıcınızı belirtmezseniz boşluk ve sekme kullanılır, bu nedenle yollarınızda boşluk yoksa, karakter belirtmeniz gerekir. tam satır almak için dosyada görünmeyecektir).


for / f aslında bir Windows 2000 ve üstü bir özelliktir. DOS'ta değil.
wendy.krieger

0

Bir cevap için yaptığınız yorumlardan birinde,

Geliştirme çalışmaları yapıyorum ve uygulamanın karmaşık yapısı nedeniyle her zaman ve bir yapıyı test etmek istiyorum (ki bu genellikle) beş dosyayı build binary dizininden install binary dizinine kopyalamak zorundayım. Bu sıkıcı olur. Şu anda, toplu iş komut dosyama kodlanmış dosya adları var, ancak komut dosyasını daha kolay bakımını sağlamak için bir diziye koymak istiyorum.

Aradığın şeyin bir Makefile ve sana uygun bir kabuk (bash veya lezzetin ne olursa olsun) vermesi için muhtemelen cygwin olduğuna inanıyorum.


0

Dizeleri ve metindeki mektubu değiştirin.

Metni bir for for öğesine genişleterek ve var ile değiştirerek döngüyü deneyin. Metin dosyasını sürükleyip bırakın, böylece% 1 set komutunu çağırarak kullanıcı girişidir.

@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

Toplu iş dosyasında böyle bir şey? Bir klasördeki bir dosyayı seçin. << yorum, kod yok

: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

Sen olamaz gerçekten komut istemine bir dizi yapmak (ve aynı zamanda Windows 3.1 çalıştıran sürece gerçekten DOS değil). Ancak, FOR komutu ile set tabanlı işlem yapabilirsiniz .

İşlenecek dosyaların listesini oluşturmak için, işlenecek bir metin dosyasını el ile oluşturabilir veya dir /b <mask>FOR döngüsündeki komutu kullanabilirsiniz .

FOR ile zor yoldan öğrendim - imleci olarak bir TEK KARAKTER değişkeni kullanmanız gerekir !


+1 değerine, bir aşağı oylamanın açıklanması gerektiği yorumunda bulunulur. Ayrıca “İmleciniz olarak bir TEK KARAKTER değişkeni kullanmanız gerekir!” Yazdınız! <- dizininizin imleciniz olarak değil demek istediği
barlop

1
Ayrıca, Win9X önyükleme diski ise bu DOS (DOS 7) olur. Ve Windows 9X'in hala DOS üzerinde çalıştığı söyleniyor. Ve bence msdos.sys'nin bootscan = 0 ve bootgui = 0 gibi Windows'a önyüklenmesini durduracak ve doğrudan bir DOS komut istemine önyükleyeceği bir satır ekleyebilirsiniz.
barlop

0

FOR batch komutundaki Microsoft belgelerine bakın . Bir dizinler dizini, bir dizindeki dosyalar veya bir dizindeki dosyalar ve tüm alt dizinlerini yinelemek için FOR düğmesini kullanabilirsiniz.

Varsayılan olarak FOR küme veya yalnızca dosyaları işler:

FOR %f IN (*.txt) DO ECHO %f

Veya özyinelemeli için:

FOR /R %f IN (*.txt) DO ECHO %f

veya sadece dizinler için:

FOR /D %d DO ECHO %d

Ne yazık ki, bu seçeneklerin tümü kendi kapsamlarına göre her şey dahil. Geliştirme çalışmaları yapıyorum ve uygulamanın karmaşık yapısı nedeniyle her zaman ve bir yapıyı test etmek istiyorum (ki bu genellikle) beş dosyayı build binary dizininden install binary dizinine kopyalamak zorundayım. Bu sıkıcı olur. Şu anda, toplu iş komut dosyama kodlanmış dosya adları var, ancak komut dosyasının bakımını daha kolay hale getirmek için bunları bir diziye koymak istiyorum.
Jim,

0

Bu bir süredir BATCH / CMD'deki tic tac tac oyunumdan te dizisini denemek için bir süre önce yaptığım küçük bir hata ayıklama dosyası. kod üzerinde büyük ve karmaşık olacak bir dizi dizisinden okuyabilir ve yazabilir.

kullanımı basittir:

Bir diziye yazma

  1. bir dosya verin veya başka bir şey almak için onu değiştirin.
  2. diziye bir isim verin.
  3. ve senin yaptığın.

Bir diziden okuma

  1. Okumak istediğiniz dizinin veya bir kısmının boyutunu verin.
  2. Dizinin adına, %% a adında bir isim girin.
  3. ve senin yaptığın.

Kod:

@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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.