Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удалить в заданных файлах кусок кода (http://forum.oszone.net/showthread.php?t=269912)

mrkane 14-10-2013 11:58 2234146

Удалить в заданных файлах кусок кода
 
Приветствую всех профи. Может ли кто-нибудь оказать посильную помощь:

Требуется:
- задать список файлов, в котором будет производиться поиск;
- задать список переменных name.

Программа находит блок кода с указанной переменной name и удаляет весь блок кода.

Пример трех блоков кода:
Код:

[1846]
; cse_abstract properties
section_name = climable_object
name = clmbl#0
position = -106.643463134766,-2.1507089138031,-143.208633422852
direction = 9.43627092055976e-005,3.14159274101257,-1.57082176208496

; cse_alife_object properties
game_vertex_id = 703
distance = 0
level_vertex_id = 172
object_flags = 0xffffffbf

; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 1.38665246963501,0,0
shape0:axis_y = 0,0.363929748535156,0
shape0:axis_z = 0,0,0.00012969970703125
shape0:offset = 0,0,0

[1857]
; cse_abstract properties
section_name = lights_hanging_lamp
name = lights_gi_r2_blue_0004
position = -71.9155960083008,-0.432599604129791,-134.792053222656
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 703
distance = 0
level_vertex_id = 172
object_flags = 0xffffffba
custom_data = <<END
[collide]
ignore_static
END

; cse_visual properties

; cse_ph_skeleton properties

; cse_alife_object_hanging_lamp properties
main_color = 0xff78879d
main_brightness = 0.100000001490116
main_color_animator = light\omni_01
main_range = 4.5
light_flags = 0x8
health = 100
main_virtual_size = 0.100000001490116
ambient_radius = 2
ambient_power = 0.100000001490116
main_cone_angle = 2.09439516067505
glow_radius = 0.699999988079071

[2518]
; cse_abstract properties
section_name = space_restrictor
name = val_farm_zone
position = -136.152282714844,0.170738220214844,-504.968627929688
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 811
distance = 0
level_vertex_id = 316473
object_flags = 0xffffff3e
story_id = 435

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 9.46899890899658

; cse_alife_space_restrictor properties
restrictor_type = 3

Например. Если задать программе удалить блок со значением name = val_farm_zone, она должна удалить весь этот блок:
Код:

[2518]
; cse_abstract properties
section_name = space_restrictor
name = val_farm_zone
position = -136.152282714844,0.170738220214844,-504.968627929688
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 811
distance = 0
level_vertex_id = 316473
object_flags = 0xffffff3e
story_id = 435

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 9.46899890899658

; cse_alife_space_restrictor properties
restrictor_type = 3

Заранее благодарю.

Foreigner 14-10-2013 21:21 2234442

Батник:
читать дальше »

Код:

@echo off
setlocal

set "list=1.ini 2.ini"
set "search=val_farm_zone"

for %%i in (%list%) do call:parse "%%i"
for /f "tokens=2 delims==" %%i in ('set file_') do echo program.exe %%i
goto:eof

:parse
set file=%~1

for /f "tokens=*" %%i in (%file%) do (

    1>nul 2>&1 (
   
        echo %%i| findstr "^\[.*\]$" && set "section=%%i"
        if "%%i"=="name = %search%" call:set
       
    )

)

goto:eof

:set
set /a cnt+=1
set "file_%cnt%=%file% %section%"


Powershell:
читать дальше »

Код:

$list = '1.ini', '2.ini'
$value = 'val_farm_zone'

$files = @{}

foreach ($file in $list) {

    switch -regex (( gc $file )) {

    "\[.*\]"        { $sec = $_ }
    "^name = $value" { $files."$file" += $sec }

    }

}

$files.keys | % {

    $f = $_
    $s = $files."$_"
   
    write-host "& program.exe $f $s"


}


ЗЫ. А внешняя программа только удаляет определенные секции? Просто это можно сделать прямо из скрипта Powershell.

mrkane 15-10-2013 08:51 2234658

Извиняюсь, что не совсем ясно изъяснился, но внешней программы нет. Я имел ввиду, что в батнике (или Powershell) нужно задать список файлов и список переменных name и при запуске этого самого батника он должен находить блоки кода, которые содержат указанные переменные и удалять их. Сможете подправить свои батник и Powershell? Спасибо.

Foreigner 18-10-2013 19:29 2236759

PowerShell:
Код:

$list = '1.ini', '2.ini'      # список файлов
$value = 'val_farm_zone'      # Значение параметра name, секцию с ним надо удалить

foreach ( $file in $list ) {

    $sections = @()
    switch -regex ( gc $file ) {
   
        "\[.*\]" { $sections += $sec; $sec = @($_) }
        default  {
       
            if ( $_ -match "^name\s=\s$value$" ) { $sec = $null }
            elseif ( $sec ) { $sec += $_ }
   
    }}
   
    $sections | sc $file

}

Лучше проверить на тестовых файлах


Время: 05:07.

Время: 05:07.
© OSzone.net 2001-