Что нового

Автоматизация Поиск файлов рекурсивно по данному списку v3

Tosyk

Новичок
Сообщения
206
Репутация
0
Помогите улучшить скрипт.

1. Есть небольшой файл со списком файлов. И есть сами файлы в папке, их много.
2. Берём файл со списком и кидаем на скрипт:
а. сначала скрипт смотрит в папку с файлами и создаёт специальный файл-базу со списком этих файлов, он длинный получается
б. затем скрипт смотрит в переданный ему небольшой файл и если имена совпадают с базой то копирует файлы в папку из этим небольшим файлом

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

помогите пожалуйста

небольшой файл, который я кидаю на скрипт:
Код:
Mesh 0 (0 alternatives)
==========================================
adachi_hair.msac.a.0.sps
adachi_hair.msac.d.0.sps
adachi_hair_0.sps
adachi_hair.msac.h.0.sps
adachi_hair.msac.g.0.sps
#ff191919.0.sps
adachi_hair.msac.f.0.sps

Mesh 1 (0 alternatives)
==========================================
hero_thighshield_chainmail.msac.d.0.sps
hero_thighshield_chainmail.msac.m.0.sps
&hero_thighshield_chainmail_msac_n&g&s.01fad73f1c5909ff0dfe67b4a016bb2a.sps

Mesh 2 (3 alternatives)
==========================================
adachi_costume_details_mlt.msac.d.0.sps
adachi_costume_details_mlt.msac.n.0.sps
adachi_costume_details_mlt.msac.g.0.sps
adachi_costume_details_mlt.msac.m.0.sps
grayhalf.bmp.0.sps
------------------------------------------
Alt 1
adachi_costume_details_mlt.msac.d.0.sps
adachi_costume_details_mlt.msac.n.0.sps
adachi_costume_details_mlt.msac.g.0.sps
adachi_costume_details_mlt.msac.m.0.sps
grayhalf.bmp.0.sps
------------------------------------------

сам скрипт:
Код:
#include <File.au3>

Global $sIniFile = FileGetShortName(@ScriptDir) & '\' & 'settings.ini'
Global $sFolder = IniRead ($sIniFile, 'Setting', 'Folder', @ScriptDir)
Global $iReplace = Int(IniRead ($sIniFile, 'Setting', 'Replace', 0))
Global $iSubDir = Int(IniRead ($sIniFile, 'Setting', 'SubDir', 0))
Global $iBuild = Int(IniRead ($sIniFile, 'Setting', 'Build', 0))
Global $iUpdate = Int(IniRead ($sIniFile, 'Setting', 'Update', 0))

Global $sListFileSearch = @ScriptDir& '\ListSearch.lst'
Global $aListFileSearch = LoadListSearch_()
Global $sListFileSave = @ScriptDir& '\ListSave.lst'
Global $aListFileSave = LoadListSave_()

If $CmdLine[0] Then
    While $CmdLine[0]
        FileRead_($CmdLine[$CmdLine[0]])
        $CmdLine[0] -= 1
    WEnd
EndIf

#cs
SaveListSave_()
If $iUpdate Then
    SaveListSearch_()
EndIf

Func SaveListSave_()
    Local $_iA, $_hFile = FileOpen($sListFileSave, 2 +8)
    For $_iA = 1 To $aListFileSave[0]
        FileWrite($_hFile, $aListFileSave[$_iA]& @CRLF)
    Next
    FileClose($_hFile)
    FileDelete($sListFileSave)
EndFunc
#ce

Func SaveListSearch_()
    Local $_iA, $_hFile = FileOpen($sListFileSearch, 2 +8)
    For $_iA = 1 To $aListFileSearch[0]
        FileWrite($_hFile, $aListFileSearch[$_iA]& @CRLF)
    Next
    FileClose($_hFile)
EndFunc

Func FileCopy_($s_FileIn)
    Local $sFileOut
    If $iBuild Then
        $sFileOut = StringReplace($s_FileIn, $sFolder, @WorkingDir & '\textures')
    Else
        $sFileOut = @WorkingDir & '\textures\' & StringRegExpReplace($s_FileIn, '(^.*)\\(.*)$', '$2')
    EndIf
    FileCopy($s_FileIn, $sFileOut, $iReplace ? 9 : 8)
EndFunc

Func FileSearch_($_sName)
    Local $_iA, $_sFile
    For $_iA = 1 To $aListFileSearch[0]
        $_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
        $_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
        Switch $_sFileName
            Case $_sName
                $aListFileSave[0] += 1
                ReDim $aListFileSave[$aListFileSave[0] +1]
                $aListFileSave[$aListFileSave[0]] = $_sFileName
                FileCopy_($aListFileSearch[$_iA])

                If $iUpdate Then
                    $aListFileSearch[$_iA] = $aListFileSearch[0]
                    ReDim $aListFileSearch[$aListFileSearch[0]]
                    $aListFileSearch[0] -= 1
                EndIf
            Return 1
        EndSwitch
    Next
EndFunc

Func CheckIsSave_($_sName)
    Local $_iA
    For $_iA = 1 To $aListFileSave[0]
        If $aListFileSave[$_iA] = $_sName Then
            Return 1
        EndIf
    Next
    Return 0
EndFunc

Func FileRead_($s_File)
    Local $h_File = FileOpen($s_File)
    Local $_sName, $i_Pos, $_sOldName, $_iStopper
    While 1
            $_sName = FileReadLine($h_File)
            If @error Then
                FileClose($h_File)
                ExitLoop
            EndIf

#cs
            If StringLeft($_sName, 5) = 'Mesh ' Then
                $_iStopper = True
                ContinueLoop
            ElseIf StringLeft($_sName, 4) = 'Alt ' Then
                $_iStopper = True
                ContinueLoop
            ElseIf StringLeft($_sName, 1) = '=' Then
                $_iStopper = ($_iStopper = False)
                ContinueLoop
            ElseIf StringLeft($_sName, 1) = '-' Then
                $_iStopper = ($_iStopper = False)
                ContinueLoop
            ElseIf $_iStopper Then
                ContinueLoop
            EndIf
#ce

            If StringInStr($_sName, '.sps') Then
                $_sName = StringRegExpReplace($_sName, '(^.*)/.sps$', '$2')
                $_sName = StringRegExpReplace($_sName, '(^.*)/$', '$1')
                ConsoleWrite('good-good: ' & $_sName & @LF)
;                    If Not CheckIsSave_($_sName) Then
                        FileSearch_($_sName)
;                    EndIf
            EndIf

    WEnd
EndFunc

Func LoadListSave_()
    Local $_sList
    If FileExists($sListFileSave) Then
        $_sList = FileRead($sListFileSave)
    EndIf
    Return StringSplit($_sList, @CRLF, 1)
EndFunc

Func CreateListSearch_($s_Folder)
    Local $h_Find = FileFindFirstFile($s_Folder& '\*.*')
    Local $s_Find, $_sList
    While 1
        $s_Find = FileFindNextFile($h_Find)
        If @error Then
            ExitLoop
        EndIf
        If StringInStr(FileGetAttrib($s_Folder& '\'& $s_Find) , 'D') Then
            If $iSubDir Then
                $_sList &= CreateListSearch_($s_Folder& '\'& $s_Find)
            EndIf
        Else
            $_sList &= $s_Folder& '\'& $s_Find& @CRLF
        EndIf
    WEnd
    FileClose($h_Find)
    Return $_sList
EndFunc

Func LoadListSearch_()
    Local $_sList
    If Not FileExists($sListFileSearch) Then
        $_sList = CreateListSearch_($sFolder)
        Local $_hFile = FileOpen($sListFileSearch, 2 +8)
        FileWrite($_hFile, $_sList)
        FileClose($_hFile)
    Else
        $_sList = FileRead($sListFileSearch)
    EndIf
    Return StringSplit($_sList, @CRLF, 1)
EndFunc
Сообщение автоматически объединено:

подскажите как модифицировать скрипт. мне кажется проблема в этой функции:
Код:
Func FileSearch_($_sName)
    Local $_iA, $_sFile
    For $_iA = 1 To $aListFileSearch[0]
        $_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
        $_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
        Switch $_sFileName
            Case $_sName
                $aListFileSave[0] += 1
                ReDim $aListFileSave[$aListFileSave[0] +1]
                $aListFileSave[$aListFileSave[0]] = $_sFileName
                FileCopy_($aListFileSearch[$_iA])

                If $iUpdate Then
                    $aListFileSearch[$_iA] = $aListFileSearch[0]
                    ReDim $aListFileSearch[$aListFileSearch[0]]
                    $aListFileSearch[0] -= 1
                EndIf
            Return 1
        EndSwitch
    Next
EndFunc
дело в том, что это скрипт однажды уже был сделан, но тогда в небольшом файле со списком у файлов не было расширений и скрипт по сути искал файл с любым расширением, а теперь расширения появились и скрипт вроде как не хочет их находить.. не могу понять почему не работает.
 
Последнее редактирование:
Верх