2016-09-28 6 views
-1

У меня есть документы с именами, как:MS Batch, переименование файлов по шаблону в списке Excel или CSV

foo_baar_AB_01.ending 
fOo_BaAr_BC_05.ending 
FOo_baaR_BA_15.ending 

и список Excel или CSV с набором правил для переименования файлов:

AB ; Data 
BC ; Stuff 
BA ; Other 

Моя задача - переименовать файлы. Результат должен выглядеть следующим образом:

foo_baar_AB_01.Data.ending 
fOo_BaAr_BC_05.Stuff.ending 
FOo_baaR_BA_15.Other.ending 

Есть ли решение для интеграции в Exel-Pattern-List в пакетном файле или я должен интегрировать шаблон-List в пакетник? И каково было бы решение этой проблемы?

+1

Не могли бы вы подтвердить формат списка; CSV должен иметь такие строки, как: «AB», «Данные». Информация, такая как формат этого файла, имеет решающее значение, если вы не ищете решение excel/VBA. – Compo

ответ

2
@echo off 
setlocal EnableDelayedExpansion 

rem Load the list of names from the ruleset 
for /F "tokens=1,2 delims=; " %%a in (list.csv) do (
    set "name[%%a]=%%b" 
) 

rem Process the files 
for /F "tokens=1-5 delims=_." %%a in ('dir /B /A-D *.ending') do (
    ECHO ren "%%a_%%b_%%c_%%d.%%e" "%%a_%%b_%%c_%%d.!name[%%c]!.%%e" 
) 

После подтвердили, что имена являются правильными, удалите ECHO часть из команды ren.

+0

Круто большое спасибо – chris

0

Вот макрос Excel, делающий то, что вы хотите. В файле первенствовать поместить правила в листе с именем правила так:

COLUMN A COOLUMN B 
    AB  Data 
    BC  Stuff 

Изменить свой путь файлы в макро линии Set objFolder = objFSO.GetFolder («C: \\ файлы»). И запустите макрос. Надеюсь, поможет.

Sub renameFiles() 
    Dim objFSO As Object 
    Dim objFolder As Object 
    Dim objFile As Object 

    Set rulesSheet = ActiveWorkbook.Worksheets("rules") 
    'Create an instance of the FileSystemObject 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    'Get the folder object 
    Set objFolder = objFSO.GetFolder("C:\\files") 
    'loops through each file in the directory 
    For Each objFile In objFolder.Files 
     Filename = objFile.Path 
     ' loop ruleset 
     rulesrow = 1 
     Do While (rulesSheet.Cells(rulesrow, 1) <> "") 
      rule = Trim(rulesSheet.Cells(rulesrow, 1)) 
      newtext = Trim(rulesSheet.Cells(rulesrow, 2)) 
      pos = InStr(Filename, rule) 
      If pos > 0 Then ' if the rule exists in your file name 
       newfilename = objFSO.getparentfoldername(Filename) & "\" & objFSO.GetBaseName(Filename) & "." & newtext & "." & objFSO.getextensionname(Filename) 
       ' rename 
       Name Filename As newfilename 
      End If 
      rulesrow = rulesrow + 1 
     Loop 
    Next objFile 
    End Sub 
1

Вложенные for петли могут сделать трюк здесь - смотрите пояснительные rem замечания:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define rule-set CSV file here: 
set "RULES=%~dp0ruleset.csv" 

rem // Resolve the files to rename, provided as command line arguments: 
for %%F in (%*) do (
    rem // Extract the third `_`-delimited token from file name: 
    for /F "tokens=3 delims=_" %%N in ("%%~nF") do (
     rem // Read the rule-set CSV file (`delims=;<TAB><SPACE>`!): 
     for /F "usebackq tokens=1,* delims=;  " %%I in ("%RULES%") do (
      rem // Check whether third token from file name matches rule: 
      if /I "%%I"=="%%N" (
       rem // File name matches, so rename file finally: 
       ECHO rename "%%~F" "%%~nF.%%J%%~xF" 
      ) 
     ) 
    ) 
) 

endlocal 
exit /B 

Это наверняка не самый производительный и эффективный метод, но это довольно просто понять.

После проверки выхода снимите верхний регистр ECHO перед rename.