1 (изменено: Аскет, 2011-12-19 13:19:47)

Тема: CMD/BAT: Массивы()

Приветствую, коллеги.
"Прошу подключиться к решению.." необычной задачи: создание и использование массивов в относительно обделённом возможностями языке пакетных файлов.

Думаю что тема может обрести не только академический интерес "ненормального программирования", но и вполне реальное практическое применение (обработка множества имён индексированного чего-бы_то_нибыло и т.п.).

Как пожелание - Pure-bat.

2

Re: CMD/BAT: Массивы()

Сходу...

@echo off

setlocal enabledelayedexpansion

:: инициализировать 10 переменные вида arr.X случайными числами
for /l %%i in ( 0, 1, 9 ) do (
	set /a arr.%%i=!RANDOM!
)

set arr

endlocal

Здесь скорее стоит вопрос о соглашении, что считать массивом и как он должен выглядеть. В своем примере я использовал "точечную" нотацию arr.i в отличие от общепринятой "скобочной" arr[i].

Пользуюсь сам именно точечной нотацией. Фактически рассматриваю такие переменные как элементы ассоциативного массива или как пространство имен, за которым удобно следить. Например, есть некоторый "проект", в котором определен набор переменных, имеющих одинаковый префикс:


set prefix.param1=%~1
set prefix.param2=%~2

:: удобство отладки
set prefix

:: легко перенапралить на STDERR
set prefix>&2

:: ... или в файл
set prefix>filename.log

:: относительно просто удалить переменные
for /f "tokens=1,* delims==" %%k in ( 'set prefix' ) do (
	set %%k=
)
( 2 * b ) || ! ( 2 * b )

3

Re: CMD/BAT: Массивы()

Замечательно - просто и гениально, а главное коротко! Спасибо.
Обращение через точку - это здравая мысль, и удобно управлять таким "массивом".
...да и с многомерными массивами тоже всё в порядке

У меня же получилось не очень - исходя из того что "массив - единое целое", т.е. одна большая строка,  с символом-разделиителем между "иднексами". А извлечение через FOR /F "TOKENS=[индекс_в_массиве] DELIMS=," %%R IN ("%ARR%") DO ....
Вобщем каша с call'ами.

4

Re: CMD/BAT: Массивы()

Представляет академический интерес как образчик "ненормального программирования" реализация ООП на чистом языке интерпретатора.

( 2 * b ) || ! ( 2 * b )

5 (изменено: alexii, 2011-12-20 01:45:04)

Re: CMD/BAT: Массивы()

DosTips.com - View topic - Words from a phrase into Variables
DosTips.com - View topic - Reverse Parsing

6

Re: CMD/BAT: Массивы()

!k, используйте тэг «url» для оформления ссылок на форуме. Я поправил Ваш пост.

7

Re: CMD/BAT: Массивы()

Rumata пишет:

В своем примере я использовал "точечную" нотацию arr.i в отличие от общепринятой "скобочной" arr[i].

Эта же идея применима для обращения к полям записей record.field

@echo off
:: (C) CyberMuesli

:demo
setlocal enabledelayedexpansion

call :GetFileInfo .\%~nx0 ArcFile
call :DisplayFileInfo ArcFile


goto :eof

::===========================================================================
:GetFileInfo
::===========================================================================
:: %1: filename %2: VarName
:: return: VarName.Origin VarName.Drive VarName.Path... etc

set %2.Origin=%1
for %%i in (%1) do (
   set %2.Drive=%%~di
   set %2.Path=%%~pi
   set %2.DPath=%%~dpi
   set %2.PNX=%%~fi
   set %2.NX=%%~nxi
   set %2.DT=%%~ti
   set %2.Size=%%~zi
)

if not "!%2.DT!"=="" (
   set %2.Year=!%2.DT:~6,4!
   set %2.Month=!%2.DT:~3,2!
   set %2.Day=!%2.DT:~0,2!
   set %2.HH=!%2.DT:~11,2!
   set %2.MM=!%2.DT:~14,2!
   set %2.SS=00
   rem call :dt2sec "%DATE% %TIME%" Now.DTSec
   rem call :dt2sec "!%2.DT!.00"     %2.DTSec
   rem set /a %2.ModifyedSecAgo=Now.DTSec-%2.DTSec
)
goto :eof

::===========================================================================
:DisplayFileInfo
::===========================================================================
echo %1.Origin        !%1.Origin!
echo %1.Drive        !%1.Drive! 
echo %1.Path        !%1.Path!  
echo %1.DPath        !%1.DPath!  
echo %1.PNX        !%1.PNX!
echo %1.NX        !%1.NX!
echo %1.DT        !%1.DT!
rem echo %1.DTSec        !%1.DTSec!
echo %1.Size        !%1.Size!
echo %1.Year,Month,Day    !%1.Year!,!%1.Month!,!%1.Day!
echo %1.HH,MM,SS    !%1.HH!,!%1.MM!,!%1.SS!
rem echo %1.ModifyedSecAgo    !%1.ModifyedSecAgo!
goto :eof