Заполнение массива в пакетном сценарии DOS

Как настроить переменную массива в пакетном сценарии DOS? Я хотел бы загрузить его со списком имен файлов для обработки. Я действительно хотел бы сохранить это как можно более простым. Спасибо тебе.

21
задан Hennes
03.01.2023 6:10 Количество просмотров материала 3151
Распечатать страницу

12 ответов

Я понял это:

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%

Я сделал что-то подобное несколько лет назад, так что это просто потребовалось выяснить. (кстати, я ненавижу изобретать колесо.) Теперь, когда он размещен здесь, надеюсь, другие найдут его полезным тоже.

48
отвечен Jim Fell 2023-01-04 13:58

да, массивы можно делать в пакетном режиме. Хотя они не совсем похожи на массивы в 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
12
отвечен Patrick Jackson 2023-01-04 16:15

из блога Jakash3,массивы в пакете описывает, как эмулировать массивы в командной строке.

пакетный файл с именем 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%.

выдает следующий результат:

image

7
отвечен harrymc 2023-01-04 18:32

это заполняет массив и выводит его

вы можете использовать names1 names2 names3, а не имена[1] имена[2] имена[3], написав имена!я! вместо имен[!я!]. Он создает массив, генерируя имена переменных. В пакете нет структуры массива. Но это так же аккуратно, как и любая структура массива, и заполнение или печать выглядит точно так же, как заполнение или печать массива на правильном языке(который на самом деле имеет структуру массива!)

@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. Это странность с пакетными файлами. См.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, Если вы повторите это, вы увидите, будет идти от 0 до последнего индекса массива с шагом 1. так будет печатать имена[0] имена[1] имена[2]

for /L %%f in (0,1,!lastindex!) do ( 
  echo !names[%%f]!
)
3
отвечен barlop 2023-01-04 20:49

вы можете действительно do массив в командной строке (а также это на самом деле не DOS, если вы не используете Windows 3.1). Однако обработку на основе наборов можно выполнять с помощью команда FOR.

чтобы создать список файлов для обработки, вы можете вручную создать текстовый файл для обработки, или использовать dir /b <mask> команда внутри цикла FOR.

что-то я узнал трудный путь С для-Вы должны использовать ОДИН СИМВОЛ переменная в качестве курсора!

1
отвечен JNK 2023-01-04 23:06

за то, что вы хотите сделать, как насчет того, используя входной переменной для каждого файла, который вы можете забрать с %1 %2 и т. д. переменные например: mybat.летучая мышь файл1.nam file2.Вьетнаме и т. д..

затем вы можете использовать эти переменные в цикле, но вам нужно использовать %1 в качестве основного параметра, так как вы можете использовать SHIFT для приведения других переменных в "позицию" %1, имея тест на null (конец переменных) с чем-то вроде "X%1" == "X"

eg:

:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE
0
отвечен Linker3000 2023-01-05 01:23

при сохранении списка файлов в filelist.txt, вы можете сделать FOR для чтения и обработки каждой строки файла, например

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

для печати каждой строки файла (до первого "|" в строке. Если вы не укажете свой собственный разделитель, будут использоваться пробел и табуляция, поэтому, если ваши пути не имеют пробелов, вам нужно указать символ, который не будет отображаться в файле, чтобы получить полные строки).

0
отвечен Neal 2023-01-05 03:40

в одном из ваших комментариев в ответ вы говорите:

Я занимаюсь разработкой, и из-за к сложному характеру применение каждый раз, когда и хотят протестируйте сборку (что часто бывает) у меня копирование пяти файлов из сборки двоичный каталог для двоичного файла установки справочник. Это становится утомительным. Право теперь у меня есть имена файлов жестко закодированные в мой пакетный скрипт, но я хотел бы положить их в массив для того чтобы сделать скрипт проще поддерживать.

Я считаю, что то, что вы ищете, это Makefile, и, возможно, cygwin, чтобы дать вам достойную оболочку (Баш, или что ваш вкус).

0
отвечен lorenzog 2023-01-05 05:57

заменить строки и Буквы в текст.

попробуйте цикл for, развернув текст в тело for и заменив var на var. Перетащите текстовый файл так, чтобы %1 был введен пользователем с помощью команды 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
отвечен mordex 2023-01-05 08:14

что-то вроде этого в пакетном файле? Выберите файл в папке. < < есть комментарий, нет кода

: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
отвечен tweakradje 2023-01-05 10:31

ознакомьтесь с документацией Microsoft по для пакета команды. Можно использовать для итерации по набору каталогов, файлов в каталоге или файлов в каталоге и всех его подкаталогах.

по умолчанию для ручек set или просто файлов:

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

или, для рекурсивного:

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

или просто каталоги:

FOR /D %d DO ECHO %d
0
отвечен heavyd 2023-01-05 12:48

Это небольшой отладочный файл, который я сделал некоторое время, чтобы проверить массив te из моей игры Tic tac tow в 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
0
отвечен Elforax 2023-01-05 15:05

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх