@echo off
setlocal
set "input=a.txt"
set "output=b.txt"
rem If defined, these sections will be modified.
set modify_sections="[NStationary]" "[Buildings]"
rem If defined, these sections will be ignored.
@rem Any section defined in modify_sections will not be ignored.
set ignore_sections="[MAIN]"
rem Loop through lines from input file and save modified lines to output.
set "section="
(
for /f "usebackq delims=" %%_ in ("%input%") do (
set "line=%%_"
call :section
if errorlevel 1 (
call :ignore
if errorlevel 1 (
@rem Get 1st 3 tokens from the line.
for /f "tokens=1-3* delims= " %%A in ("%%_") do (
set "a=%%A" & set "b=%%B" & set "c=%%C"
@rem Get tokens from the previous remainder.
for /f "tokens=1-4* delims=. " %%a in ("%%D") do (
set "d=%%a" & set "e=%%b" & set "f=%%c" & set "g=%%d" & set "h=%%e"
call :modify
)
)
)
)
)
) 3> "%output%"
exit /b 0
:ignore
setlocal enabledelayedexpansion
rem Preset ignore_section default.
if defined modify_sections (set "ignore_section=1") else set "ignore_section="
rem Check if ignore this section.
for %%A in (%ignore_sections%) do if /i "%section%" == "%%~A" set "ignore_section=1"
rem Check if modify this section.
for %%A in (%modify_sections%) do if /i "%section%" == "%%~A" set "ignore_section="
if not defined ignore_section exit /b 1
rem Ignoring line.
>&3 echo !line!
exit /b 0
:section
setlocal enabledelayedexpansion
rem Check for section name.
if not "!line:~,1!" == "[" exit /b 1
rem Found section name %line%.
>&3 echo !line!
endlocal & set "section=%line%"
exit /b 0
:modify
setlocal enabledelayedexpansion
rem d,f add or minus random number from original number.
if !random:~-1! gtr 4 (set /a "d+=!random:~,3!") else set /a "d-=!random:~,3!"
if !random:~-1! gtr 4 (set /a "f+=!random:~,3!") else set /a "f-=!random:~,3!"
rem e,g replace with random number and pad with 0 if needed.
set "e=!random:~-2!" & if "!e:~1!" == "" set "e=0!e!"
set "g=!random:~-2!" & if "!g:~1!" == "" set "g=0!g!"
rem Modified output.
>&3 echo !a! !b! !c! !d!.!e! !f!.!g! !h!
exit /b 0
Поскольку пакетный файл не может работать с числами с плавающей запятой, цикл for
будет разделять точкой и пробелом, что составляет 4 числа из двух чисел с плавающей запятой.
На основе
27_Статическая техника. Артиллерия. Артиллерия $ Flak18_88mm 2 315710.13 222342.17 570.00 0,0 0 1 1
a.txt
читается построчнои изначально не разделены.call :section
проверит, обнаружено ли имя раздела из текущей строки, и будет сохранен в %section%
, если истина, и строка будет немедленно передана в файл.
%%_
ограничен до:
a
= %%A
= 27_Static
b
= %%B
= vehicles.artillery.Artillery$Flak18_88mm
c
= %%C
= 2
*
= %%D
= 315710.13 222342.17 570.00 0.0 0 1 1
%%A
до %%C
- токены 1-3
и %%D
- токен *
, что является остатком.
%%D
ограничивается:
d
= %%a
= 315710
e
=%%b
= 13
f
= %%c
= 222342
g
= %%d
= 17
h
= %%e
= 570.00 0.0 0 1 1
%%a
до %%d
- токены 1-4
, а %%e
- токен *
, который является остатком.
for
переменные установлены в статические переменные, т.е. set "a=%%A"
.
Все токены, кроме %%D
, установлены на каждый из %a%-%h%
.%d%
и %f%
имеют случайное число из 3 цифр, добавляемых или вычитаемых из каждой из них.%e%
и %g%
заменяются случайными числами из 2 случайных цифр.
Для обработки разделов во входном файле существуют переменные %modify_sections%
и %ignore_sections%
, поэтому модификацией можно управлять по разделам.Если оба не определены, то все разделы будут изменены.%modify_sections%
имеет приоритет над %ignore_sections%
и, следовательно, секции %modify_sections%
всегда будут изменены.%ignore_sections%
может быть полезно, если %modify_sections%
не определено.
Каждая измененная строка выводится на %output%
.Поток 3 используется для отображения эха в файл, что означает, что вы можете запустить скрипт с echo on
или добавить эхо в метку :modify
, :section
или :ignore
, которая будет выводиться на консоль, а не в выходной файл.