1

Тема: AHK: Сложный вопрос. Поиск файлов и изменение строк

Добрый день всем!
Постараюсь объяснить суть вопроса.
Имеется какой-либо *.iso с Linux дистрибутивом, где в \root находится директория "isolinux".
Соответственно в isolinux размещаются конфиги типа *.cfg, в основном интересует isolinux.cfg, но есть и другие.

Здесь в *.cfg интересуют строки подобного типа:

kernel /casper/vmlinuz
append  file=/cdrom/preseed/custom.seed boot=casper initrd=/casper/initrd.gz text splash vga=791--

В случае распаковки *.iso в какую-либо директорию, получаем isolinux здесь: (например) J:\XXXX\isolinux
теперь нужно перекопать все конфиги в J:\XXXX\isolinux\*.cfg в посках подобных строк и изменить в них пути, типа:

kernel /XXXX/casper/vmlinuz
append  file=/cdrom/XXXX/preseed/custom.seed boot=casper cdrom-detect/try-usb=true noprompt floppy.allowed_drive_mask=0 ignore_uuid live-media-path=/XXXX/casper/ initrd=/XXXX/casper/initrd.gz text splash vga=791--

Соответственно, если файл isolinux.cfg, его нужно переименовать в syslinux.cfg. Имена остальных конфигов не менять.

Задача не из простых. Написал уже около 300 строк кода и уперся рогами в этот дуб ...
Возможно ли решить этот вопрос средствами AutoHotkey? Или эта задача из категории unreal???

Заранее благодарю за помощь!

Лучше день потерять, потом за пять минут долететь!

2

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

в основном интересует isolinux.cfg, но есть и другие

IfExist / IfNotExist


нужно перекопать все конфиги в J:\XXXX\isolinux\*.cfg

Loop (файлы и папки)
Loop (чтение файла)
FileRead


здесь в *.cfg интересуют строки подобного типа

if var in/contains MatchList
IfInString / IfNotInString
InStr()
RegExMatch()


если файл isolinux.cfg, его нужно переименовать в syslinux.cfg

FileMove

3 (изменено: Dr.Jekyll, 2014-10-18 17:57:34)

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Это я знаю. А вот как реализовать все вместе? Основная проблема в том, что в нескольких местах одной строки нужно изменить путь, если он там указан. Вот этот пример:

append  file=/cdrom/XXXX/preseed/custom.seed boot=casper cdrom-detect/try-usb=true noprompt floppy.allowed_drive_mask=0 ignore_uuid live-media-path=/XXXX/casper/ initrd=/XXXX/casper/initrd.gz text splash vga=791--
DestDrive := "J:\"

Loop, %DestDrive%\*, 2, 1
If A_LoopFileName = isolinux
    {
    DestDir := A_LoopFileLongPath
    }
    
Loop, %DestDir%\*.cfg
    {
    FileName := A_LoopFileLongPath
    Loop, read, %FileName%
        {
        А что дальше? ... Это не прокатит:
        IfInString, A_LoopReadLine, casper, MsgBox, %A_LoopReadLine%`n
        }
    }

Кроме того, путь расположения isolinux может быть и таким J:\XXXX\ZZZZ\isolinux
Надо из него сделать вида /XXXX/ZZZZ/ и добавить в каждую строку, где указан путь ....

Лучше день потерять, потом за пять минут долететь!

4

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Dr.Jekyll пишет:

Здесь в *.cfg интересуют строки подобного типа:

kernel /casper/vmlinuz
append  file=/cdrom/preseed/custom.seed boot=casper initrd=/casper/initrd.gz text splash vga=791--

В случае распаковки *.iso в какую-либо директорию, получаем isolinux здесь: (например) J:\XXXX\isolinux
теперь нужно перекопать все конфиги в J:\XXXX\isolinux\*.cfg в посках подобных строк и изменить в них пути, типа:

kernel /XXXX/casper/vmlinuz
append  file=/cdrom/XXXX/preseed/custom.seed boot=casper cdrom-detect/try-usb=true noprompt floppy.allowed_drive_mask=0 ignore_uuid live-media-path=/XXXX/casper/ initrd=/XXXX/casper/initrd.gz text splash vga=791--

Никак не догоню: ЗДЕСЬ - это ГДЕ?

в нескольких местах одной строки нужно изменить путь, если он там указан

Мне кажется, Ваша задача звучит так:

  • Определить, содержит ли строка путь к файлу

  • Если содержит, то заменить его на другой, заранее известный путь

Если да, то осталось выяснить, каким образом путь к файлу отличается от прочей информации.

5

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Кроме того, путь расположения isolinux может быть и таким J:\XXXX\ZZZZ\isolinux
Надо из него сделать вида (в формате Linux) /XXXX/ZZZZ/ и добавить в каждую строку, где указан путь ....

Здесь, это в во всех файлах *.cfg, содержащие подобные строки:

kernel /XXXX/casper/vmlinuz
append  file=/cdrom/XXXX/preseed/custom.seed boot=casper cdrom-detect/try-usb=true noprompt floppy.allowed_drive_mask=0 ignore_uuid live-media-path=/XXXX/casper/ initrd=/XXXX/casper/initrd.gz text splash vga=791--

но в некоторых строках путь может быть указан неоднократно

Лучше день потерять, потом за пять минут долететь!

6

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Ничего не понимаю (c).
http://mb-team.ru/download/file.php?avatar=2523_1372364885.jpeg

Лучше привести пример типа
1) как было
2) как стало

7 (изменено: Dr.Jekyll, 2014-10-18 23:08:53)

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

ОК. В самом первом посте написал примеры строк

Было:

kernel /casper/vmlinuz
append  file=/cdrom/preseed/custom.seed boot=casper initrd=/casper/initrd.gz text splash vga=791--

Нужно:

kernel /XXXX/casper/vmlinuz
append  file=/cdrom/XXXX/preseed/custom.seed boot=casper cdrom-detect/try-usb=true noprompt floppy.allowed_drive_mask=0 ignore_uuid live-media-path=/XXXX/casper/ initrd=/XXXX/casper/initrd.gz text splash vga=791--

в "нужно" отмечено все нужное XXXX - это новый путь, который надо добавить.
Несколько раз в одной строке.
Предполагается, что путь заранее не известен. Поэтому идем по такому принципу:

DestDrive := "J:\" ; Диск, где все находится

Loop, %DestDrive%\*, 2, 1 ; Ищем директорию isolinux с рекурсией в субдиректории
If A_LoopFileName = isolinux
    {
    DestDir := A_LoopFileLongPath ; Нашли isolinux
    }
    
Loop, %DestDir%\*.cfg ; Теперь ищем все конфиги *.cfg в директории isolinux
    {
    FileName := A_LoopFileLongPath ; Нашли первый файл конфига
    Loop, read, %FileName%
        {
        А что дальше? ... Это не прокатит:
        IfInString, A_LoopReadLine, casper, MsgBox, %A_LoopReadLine%`n
        }
    }

Замена виндового формата пути вида J:\XXXX\ZZZZ\isolinux на линуксовый вида /XXXX/ZZZZ/ с отрубанием isolinux:

DestDrive := "J:\"

Loop, %DestDrive%\*, 2, 1
If A_LoopFileName = isolinux
    {
    DestDir := A_LoopFileLongPath
    }
LinuxFormat := SubStr(DestDir, 3, InStr(DestDir, "\")-11)
LinuxFormat := RegExReplace(LinuxFormat, "\\", "/")

MsgBox Windows Format: "%DestDir%"`n`nLinux Format: "%LinuxFormat%"

Как добавить ЭТО во все строки во всех файлах конфигах, где XXXX ?

Лучше день потерять, потом за пять минут долететь!

8

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

То есть алгоритм такой: находим среди файлов *.cfg тот, что содержит слово kernel. Из него извлекаем путь AAAA. Затем прочёсываем все файлы *.cfg и изменяем все найденные пути AAAA на XXXX. Так?

9 (изменено: Dr.Jekyll, 2014-10-18 23:39:07)

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

В том-то и дело, что некоторые строки несколько раз содержат путь. К чему привязаться, я не понимаю.

Вот эта строка:

append  file=/cdrom/XXXX/preseed/custom.seed boot=casper cdrom-detect/try-usb=true noprompt floppy.allowed_drive_mask=0 ignore_uuid live-media-path=/XXXX/casper/ initrd=/XXXX/casper/initrd.gz text splash vga=791--

Посмотрите сколько раз встречается путь (обозначен XXXX, куда надо добавить новый путь) ....

Стока с "kernel" - это не проблема. Здесь все просто.

Лучше день потерять, потом за пять минут долететь!

10

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Содержимое прочитанных строк записываем в переменную. Если в строке содержится путь AAAA, заменяем его на XXXX и также дописываем изменённую строку в переменную. Когда файл закончился, при условии, что хотя бы раз были внесены поправки, следует старый файл удалить командой FileDelete и записать вместо него новый одноимённый файл командой FileAppend.

11

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Ничего не понимаю .... Можно как-то наглядно?

Лучше день потерять, потом за пять минут долететь!

12

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Допустим, мы уже знаем путь AAAA. Мы уже знаем, как он будет выглядеть в формате XXXX.

Комадой Loop (файлы и папки) перебираем все файлы *.cfg

Внутри вышеуказанного цикла командой Loop (чтение файла) перебираем строки. Проверяем командой IfInString: если строка не содержит путь AAAA, то просто помещаем её в переменную. Если строка содержит путь AAAA, то изменяем внутри строки все AAAA на XXXX и добавляем её в ту же переменную. При этом создаём для себя метку, что были сделаны изменения.
В конце чтения файла, если были сделаны изменения, то старый файл удаляем, а на его место записываем новый. Содержимое нового файла берём из переменной, в которую "складывали" строки. Если изменений никаких не было, то просто очищаем переменную и переходим к следующему файлу.

13 (изменено: Dr.Jekyll, 2014-10-19 05:27:45)

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Хыть ап стену убейся, а ничего не получается ...

DestDrive := "J:\"

Loop, %DestDrive%\*, 2, 1
If A_LoopFileName = isolinux
    {
    DestDir := A_LoopFileLongPath
    }
LinuxFormPath := SubStr(DestDir, 3, InStr(DestDir, "\isolinux")-2)
LinuxFormPath := RegExReplace(LinuxFormPath, "\\", "/")

Loop, %DestDir%\*.cfg
    {
    ConfigFullPath := A_LoopFileLongPath
    ConfigName := A_LoopFileName
    If ConfigName = isolinux.cfg
        {
        NewConfigFile := DestDir . "\syslinux.cfg"
        }
        
    Loop, read, % ConfigFullPath
        {
        FileAppend,
            (
            % RegExReplace(A_LoopReadLine, "/casper" , LinuxFormPath . "casper") . "`n"
            ), % NewConfigFile
        }
    }

Так за один раз все не меняет ... что делать ...

Лучше день потерять, потом за пять минут долететь!

14

Re: AHK: Сложный вопрос. Поиск файлов и изменение строк

Кажется догнал ... вот так работает:

DestDrive := "J:\"

Loop, %DestDrive%\*, 2, 1
If A_LoopFileName = isolinux
    {
    DestDir := A_LoopFileLongPath
    }
LinuxFormPath := SubStr(DestDir, 3, InStr(DestDir, "\isolinux")-2)
LinuxFormPath := RegExReplace(LinuxFormPath, "\\", "/")

Loop, %DestDir%\*.cfg
    {
    ConfigFullPath := A_LoopFileLongPath
    ConfigName := A_LoopFileName
    If ConfigName = isolinux.cfg
        {
        NewConfigFile := DestDir . "\syslinux.cfg"
        }
        
    Loop, read, % ConfigFullPath
        {
        NewPath := RegExReplace(A_LoopReadLine, "/casper", LinuxFormPath . "casper")
        NewPath := RegExReplace(NewPath, "cdrom/", "cdrom" . LinuxFormPath)
        FileAppend,
            (
            % NewPath . "`n"
            ), % NewConfigFile
        }
    }

Может как-то по-другому надо, но работает это! ...

Лучше день потерять, потом за пять минут долететь!