Что нового

Найти файл по маске и удалить часть слова из названия

Сообщения
95
Репутация
-1
Добро время суток. Имеется небольшая куча файлов с маской Имя_проги_*.PAK_*.bin (Пример: Имя_проги_SETUP_STRINGS_EN-US.PAK_BN.bin). Необходимо найти все файлы и переименовать их удалив часть текста из названия. Т.е Имя_проги_SETUP_STRINGS_EN-US.PAK_BN.bin -> SETUP_STRINGS_EN-US.PAK
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Код:
$sDirIn = 'D:\Test'
Func RenameFile_($_sDirIn)
    Local $_hList = FileFindFirstFile($_sDirIn & '\*.bin')
    Local $_sFileIn, $_sFileOut
    While 1
        $_sFileIn = FileFindNextFile($_hList)
        If @error Then
            ExitLoop
        EndIf
        If @extended Then
            RenameFile_($_sDirIn & '\' & $_sFileIn)
        Else
            $_sFileOut = StringRegExpReplace($_sFileIn, '(.*_)?(SETUP_STRINGS_.*?.PAK)(_.*)?', '$2')
            If @extended Then
                FileMove($_sDirIn & '\' & $_sFileIn, $_sDirIn & '\' & $_sFileOut, 8)
            EndIf
        EndIf
    WEnd
    FileClose($_hList)
EndFunc
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
Не работает. Версия Autoit 3.3.14.2 + SciTE.
Program_Setup_x64_SETUP_IMAGES_100_PERCENT.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_DE.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_EL.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_EN-US.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_ES.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_FR.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_IT.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_JA.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_KO.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_PL.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_PT-BR.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_RU.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_VI.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_ZH-CN.PAK_BN.bin
Program_Setup_x64_SETUP_STRINGS_ZH-TW.PAK_BN.bin
Program_Setup_x64_UI_RESOURCES_100_PERCENT.PAK_BN.bin
Program_Setup_x64_VIEWS_RESOURCES_100_PERCENT.PAK_BN.bin
Код:
$sDirIn = @ScriptDir
Func RenameFile_($_sDirIn)
    Local $_hList = FileFindFirstFile($sDirIn & '\Program_Setup_x64_*.PAK_BN.bin')
    Local $_sFileIn, $_sFileOut
    While 1
        $_sFileIn = FileFindNextFile($_hList)
        If @error Then
            ExitLoop
        EndIf
        If @extended Then
            RenameFile_($_sDirIn & '\' & $_sFileIn)
        Else
            $_sFileOut = StringRegExpReplace($_sFileIn, '(.*_)?(SETUP_STRINGS_.*?.PAK)(_.*)?', '$2')
            If @extended Then
                FileMove($_sDirIn & '\' & $_sFileIn, $_sDirIn & '\' & $_sFileOut, 8)
            EndIf
        EndIf
    WEnd
    FileClose($_hList)
EndFunc
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Вы писали выше:
Т.е Имя_проги_SETUP_STRINGS_EN-US.PAK_BN.bin -> SETUP_STRINGS_EN-US.PAK
А теперь ищите:
Имя_проги_Setup_x64_*.PAK_BN.bin
Естественно не будет работать так как мой шаблон ищет:
Имя_проги_Setup_STRINGS_*.PAK_BN.bin
И выдает в результате:
Setup_STRINGS_*.PAK

Пробуйте так:
Код:
$sDirIn = 'D:\Test'
Func RenameFile_($_sDirIn)
    Local $_hList = FileFindFirstFile($_sDirIn & '\*.bin')
    Local $_sFileIn, $_sFileOut
    While 1
        $_sFileIn = FileFindNextFile($_hList)
        If @error Then
            ExitLoop
        EndIf
        If @extended Then
            RenameFile_($_sDirIn & '\' & $_sFileIn)
        Else
            $_sFileOut = StringRegExpReplace($_sFileIn, '(.*_)?(SETUP.*?.PAK)(_.*)?', '$2')
            If @extended Then
                FileMove($_sDirIn & '\' & $_sFileIn, $_sDirIn & '\' & $_sFileOut, 8)
            EndIf
        EndIf
    WEnd
    FileClose($_hList)
EndFunc

Сообщение автоматически объединено:

И
FileFindFirstFile($sDirIn & '\*.bin')
не нужно заменять на
FileFindFirstFile($sDirIn & '\Program_Setup_x64_*.PAK_BN.bin')
в противном случае переименование в под папках не произойдет.
 
Последнее редактирование:
Автор
Xabib2302
Сообщения
95
Репутация
-1
Увы. Все равно не работает. Я заменил только путь к каталогу и все
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
И я не досмотрел и вы не поняли, что чтобы функция сработала ее нужно вызвать.
Берите весь этот код, так как есть правки.
Код:
$sDirIn = 'D:\Desktop\Новая папка (3)'
RenameFile_($sDirIn)

Func RenameFile_($_sDirIn)
    Local $_hList = FileFindFirstFile($_sDirIn & '\*.*')
    Local $_sFileIn, $_sFileOut
    While 1
        $_sFileIn = FileFindNextFile($_hList)
        If @error Then
            ExitLoop
        EndIf
        If @extended Then
            ConsoleWrite('D'&@CRLF)
            RenameFile_($_sDirIn & '\' & $_sFileIn)
        Else
            ConsoleWrite('F'&@CRLF)
            $_sFileOut = StringRegExpReplace($_sFileIn, '(.*_)?(SETUP.*?.PAK)(_.*)?\.bin', '$2')
            If @extended Then
                FileMove($_sDirIn & '\' & $_sFileIn, $_sDirIn & '\' & $_sFileOut, 8)
            EndIf
        EndIf
    WEnd
    FileClose($_hList)
EndFunc
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
Огромное спасибо! Но...
Код:
$sDirIn = @ScriptDir & '\Temp'
RenameFile_($sDirIn)

Func RenameFile_($_sDirIn)
    Local $_hList = FileFindFirstFile($_sDirIn & '\*.*')
    Local $_sFileIn, $_sFileOut
    While 1
        $_sFileIn = FileFindNextFile($_hList)
        If @error Then
            ExitLoop
        EndIf
        If @extended Then
            ConsoleWrite('D'&@CRLF)
            RenameFile_($_sDirIn & '\' & $_sFileIn)
        Else
            ConsoleWrite('F'&@CRLF)
            $_sFileOut = StringRegExpReplace($_sFileIn, '(.*_)?(x64.*?.PAK)(_.*)?\.bin', '$2')
            If @extended Then
                FileMove($_sDirIn & '\' & $_sFileIn, $_sDirIn & '\' & $_sFileOut, 8)
            EndIf
        EndIf
    WEnd
    FileClose($_hList)
EndFunc

Но осталась удалить x64_ в начале названии файлов. Пытался попробовать так, чтобы хотя бы удалить x64,
Код:
$sPath = @ScriptDir & '\Temp'
$hSearch = FileFindFirstFile($sPath & '\*.*') ; возвращает дескриптор поиска, определяющий путь и маску

; Проверка, является ли поиск успешным
If $hSearch = -1 Then
    MsgBox(4096, "Ошибка", "Ни один из файлов или каталогов не соответствует маске поиска")
    Exit
EndIf

While 1
    $sFile = FileFindNextFile($hSearch) ; возвращает имя следующего файла, начиная от первого до последнего
    If @error Then ExitLoop
    If @extended Then
        $sType = 'Каталог: '
    Else
        $sType = 'Файл: '
    EndIf
    ConsoleWrite($sFile & @CRLF)
    $sFiles = StringRight($sFile, StringInStr($sFile, "_", 0, -1) - 1)
    ConsoleWrite($sFiles & @CRLF)
    FileMove($sPath & '\' & $sFile, $sPath & '\' & $sFiles)
WEnd

; Закрывает дескриптор поиска
FileClose($hSearch)

но удаляет на несколько символов больше x64_. Т.е из x64_SETUP_STRINGS_EN-US.PAK в UP_STRINGS_EN-US.PAK
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Не знаю что вы колдуете, но зачем трогать
$_sFileOut = StringRegExpReplace($_sFileIn, '(.*_)?(SETUP.*?.PAK)(_.*)?\.bin', '$2')
если вы не знакомы с рег. выражениями.
Это регулярное выражение как раз и выдергивает нужную комбинацию слов из имени файла

Код выше, мною выложенный переименовывает
Program_Setup_x64_SETUP_STRINGS_EN-US.PAK_BN.bin
в
 
Верх