2010-09-21 18:44:45 +0000 2010-09-21 18:44:45 +0000
34
34

Wypełnianie tablicy w skrypcie wsadowym DOS-u

Jak mogę ustawić zmienną tablicową w skrypcie wsadowym DOS? Chciałbym załadować do niego listę nazw plików do przetworzenia. Naprawdę chciałbym, aby było to tak proste, jak to tylko możliwe. Dziękuję.

Odpowiedzi (12)

48
48
48
2010-09-21 20:58:31 +0000

Rozgryzłem to:

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%

Zrobiłem coś podobnego kilka lat temu, więc po prostu wymagało to trochę rozgryzienia. (btw, nienawidzę wymyślać koła na nowo.) Teraz, gdy jest to tutaj opublikowane, mam nadzieję, że inni też znajdą to użyteczne.

13
13
13
2013-02-18 23:27:03 +0000

Tak, możesz robić tablice w wsadzie. Chociaż nie są one dokładnie takie jak tablice w C lub VB, możesz to zrobić:

@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
7
7
7
2010-09-21 20:48:19 +0000

Z bloga Jakash3, Tablice w trybie wsadowym opisuje jak emulować tablice w wierszu poleceń.

Do artykułu dołączony jest plik wsadowy o nazwie array.bat, który zawiera bibliotekę funkcji służących do obsługi tablic. Będziesz musiał wybrać tekst z artykułu i wkleić go do pliku wsadowego.

Na przykład, następujący skrypt testowy:

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

generuje następujące dane wyjściowe:

4
4
4
2014-08-29 11:53:30 +0000

To wypełnia tablicę i wypisuje ją

Możesz użyć names1 names2 names3, zamiast names[1] names[2] names[3], pisząc names!i! zamiast names[!i!]. Tworzy on tablicę poprzez generowanie nazw zmiennych. W batchu nie ma struktury tablicowej. Ale jest ona tak schludna jak każda inna struktura tablicowa, a wypełnianie i drukowanie wygląda dokładnie tak, jak wypełnianie i drukowanie tablicy w odpowiednim języku (który ma strukturę tablicową!)

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

wyjście -

c:\blah>a
bob
tom
joseph

c:\blah>

Jakieś wyjaśnienie -

setlocal enabledelayedexpansion enableextensions z !var! zamiast %var% jest konieczne, aby zapobiec dziwnemu zachowaniu, tak że zmienne zachowują się poprawnie, gdy są wewnątrz FOR lub IF. Jest to dziwactwo z plikami wsadowymi. Zobacz set /? gdzie jest o tym mowa dalej.

To właśnie wypełnia tablicę, i jest dość proste dla każdego, kto zna się na tablicach. Mógłbyś również zrobić names[0]=bobnames[1]=tom names[2]=joseph, ale jedną z pięknych cech tablicy jest możliwość wypełnienia jej pętlą, co właśnie zrobiłem.

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

To wyświetla tablicę. %%f gdybyś zobaczył echo, zobaczyłbyś, że pętla przejdzie od 0 do ostatniego indeksu tablicy, w krokach co 1. więc wypisze names[0] names[1] names[2]

for /L %%f in (0,1,!lastindex!) do ( 
  echo !names[%%f]!
)
0
0
0
2014-05-01 20:03:34 +0000

Zamiana łańcuchów i liter w tekście.

Wypróbuj pętlę for przez rozwinięcie tekstu do ciała for i zastąpienie var przez var. Przeciągnij i upuść plik tekstowy tak, aby %1 było danymi wejściowymi użytkownika przez wywołanie polecenia set.

@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
0
0
2010-09-21 18:53:17 +0000

Nie możesz naprawdę zrobić tablicy w wierszu poleceń (a także nie jest to tak naprawdę DOS, chyba że pracujesz pod Windows 3.1). Możesz jednak wykonać przetwarzanie oparte na zestawach za pomocą polecenia FOR. ](http://www.robvanderwoude.com/ntfor.php)

Aby utworzyć listę plików do przetworzenia, możesz ręcznie utworzyć plik tekstowy do przetworzenia lub użyć polecenia dir /b <mask> wewnątrz pętli FOR.

Coś, czego nauczyłem się w ciężki sposób z FOR - musisz użyć zmiennej o SINGLE CHARACTER jako swojego kursora!

0
0
0
2010-09-21 19:42:14 +0000

Dla tego, co chcesz zrobić, co powiesz na użycie zmiennej wejściowej dla każdej nazwy pliku, którą możesz odebrać za pomocą zmiennych %1 %2 itd. np: mybat.bat file1.nam file2.nam itd.

Możesz następnie użyć tych zmiennych w pętli, ale musisz tylko użyć %1 jako głównego parametru, ponieważ możesz użyć SHIFT do przeniesienia innych zmiennych na ‘pozycję’ %1, mając test na null (koniec zmiennych) z czymś takim jak IF “X%1” == “X”

np:

:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE
0
0
0
2010-09-21 19:07:50 +0000

Zapoznaj się z dokumentacją Microsoftu dotyczącą polecenia wsadowego FOR ](https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx?mfr=true). Możesz użyć FOR do iteracji po zestawie katalogów, plików w katalogu lub plików w katalogu i wszystkich jego podkatalogach.

Domyślnie FOR obsługuje zestaw lub tylko pliki:

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

Lub, dla rekurencyjnych:

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

lub, dla tylko katalogów:

FOR /D %d DO ECHO %d
0
0
0
2010-09-21 20:04:48 +0000

Jeśli zapiszesz listę plików w pliku filelist.txt, możesz uzyskać FOR do odczytania i przetworzenia każdej linii pliku, np.

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

do wydrukowania każdej linii pliku (aż do pierwszego “|” w linii. Jeśli nie podasz własnego ogranicznika, użyta zostanie spacja i tabulator, więc jeśli twoje ścieżki nie mają spacji, musisz podać znak, który nie pojawi się w pliku, aby uzyskać pełne linie).

0
0
0
2016-08-16 12:37:34 +0000

to jest mały plik debugowania, który zrobiłem jakiś czas temu, aby przetestować tablicę z mojej gry tic tac tow w BATCH / CMD. może on odczytywać i zapisywać do i z tablicy bez zbytniego komplikowania kodu.

Używanie go jest proste:

Zapis do tablicy

  1. Daj mu plik lub zmodyfikuj go, aby zaimportować coś innego.
  2. nadaj tablicy nazwę.
  3. i gotowe.

Odczyt z tablicy

  1. Podaj rozmiar tablicy lub jej części, którą chcesz odczytać.
  2. Wpisz nazwę tablicy z %%a w nazwie
  3. i gotowe.

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
0
0
0
2010-09-21 20:11:25 +0000

W jednym z komentarzy do odpowiedzi napisałeś:

Zajmuję się rozwojem aplikacji, a ze względu na złożoną naturę aplikacji za każdym razem, gdy chcę przetestować build (co jest częste), muszę skopiować pięć plików z katalogu binarnego build do katalogu binarnego install. To staje się uciążliwe. W tej chwili mam nazwy plików zakodowane w moim skrypcie wsadowym, ale chciałbym umieścić je w tablicy, aby skrypt był łatwiejszy w utrzymaniu.

Wierzę, że to, czego szukasz, to plik Makefile i ewentualnie cygwin, który da ci przyzwoitą powłokę (bash, lub jakikolwiek inny twój smak).

0
0
0
2014-08-28 20:57:17 +0000

Coś takiego w pliku wsadowym? Wybierz plik w folderze. << To jest komentarz, bez kodu

: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