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.
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.
Yanıtlar:
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.
()
sözdizimi kullanarak dizileri destekleyip desteklemediğini görmek için kullanışlı bir MS-DOS yüklemesi yok .
FILE_LIST[0]
.
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
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:
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]=joseph
Bir 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]!
)
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
Dosya listesini filelist.txt FOR
dosyası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).
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.
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
)
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
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 !
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
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
Bir diziden okuma
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