Как настроить переменную массива в пакетном сценарии DOS? Я хотел бы загрузить его со списком имен файлов для обработки. Я действительно хотел бы сохранить это как можно более простым. Спасибо тебе.
Заполнение массива в пакетном сценарии DOS
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%
Я сделал что-то подобное несколько лет назад, так что это просто потребовалось выяснить. (кстати, я ненавижу изобретать колесо.) Теперь, когда он размещен здесь, надеюсь, другие найдут его полезным тоже.
да, массивы можно делать в пакетном режиме. Хотя они не совсем похожи на массивы в 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
из блога 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%.
выдает следующий результат:
это заполняет массив и выводит его
вы можете использовать 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]!
)
вы можете действительно do массив в командной строке (а также это на самом деле не DOS, если вы не используете Windows 3.1). Однако обработку на основе наборов можно выполнять с помощью команда FOR.
чтобы создать список файлов для обработки, вы можете вручную создать текстовый файл для обработки, или использовать dir /b <mask>
команда внутри цикла FOR.
что-то я узнал трудный путь С для-Вы должны использовать ОДИН СИМВОЛ переменная в качестве курсора!
за то, что вы хотите сделать, как насчет того, используя входной переменной для каждого файла, который вы можете забрать с %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
при сохранении списка файлов в filelist.txt, вы можете сделать FOR
для чтения и обработки каждой строки файла, например
FOR /F "delims=|" %i IN (filelist.txt) DO @echo %i
для печати каждой строки файла (до первого "|" в строке. Если вы не укажете свой собственный разделитель, будут использоваться пробел и табуляция, поэтому, если ваши пути не имеют пробелов, вам нужно указать символ, который не будет отображаться в файле, чтобы получить полные строки).
в одном из ваших комментариев в ответ вы говорите:
Я занимаюсь разработкой, и из-за к сложному характеру применение каждый раз, когда и хотят протестируйте сборку (что часто бывает) у меня копирование пяти файлов из сборки двоичный каталог для двоичного файла установки справочник. Это становится утомительным. Право теперь у меня есть имена файлов жестко закодированные в мой пакетный скрипт, но я хотел бы положить их в массив для того чтобы сделать скрипт проще поддерживать.
Я считаю, что то, что вы ищете, это Makefile, и, возможно, cygwin, чтобы дать вам достойную оболочку (Баш, или что ваш вкус).
заменить строки и Буквы в текст.
попробуйте цикл 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
)
что-то вроде этого в пакетном файле? Выберите файл в папке. < < есть комментарий, нет кода
: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
ознакомьтесь с документацией Microsoft по для пакета команды. Можно использовать для итерации по набору каталогов, файлов в каталоге или файлов в каталоге и всех его подкаталогах.
по умолчанию для ручек set или просто файлов:
FOR %f IN (*.txt) DO ECHO %f
или, для рекурсивного:
FOR /R %f IN (*.txt) DO ECHO %f
или просто каталоги:
FOR /D %d DO ECHO %d
Это небольшой отладочный файл, который я сделал некоторое время, чтобы проверить массив te из моей игры Tic tac tow в BATCH / CMD. он может читать и писать В и из массива whitout собирается большой и сложный код.
использовать его просто:
запись в массив
- дайте ему файл или измените его, чтобы импортировать что-то еще.
- дайте массиву имя.
- и все готово.
чтение массив
- дайте размер массива или его части, которую вы хотите прочитать.
- введите имя массива с %%a в имени
- и все готово.
код:
@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
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]