Компьютерный форум 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=317365)

LukAleX 31-07-2016 18:42 2655775

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

ЕСТЬ
PA-1312.PDF
бла-бла-блаPA-1513.PDF
PA-6734тыц-тыц-тыц.PDF
PA-6734тру-ля-ля.PDF
ля-ля-ляPA-5617ля-ля-ля.PDF


то есть в имени есть неизменная часть "PA-" и следующие за ней случайные 4 символа (вся проблема в этих символах).
Задача состоит в том что нужно переименовать все файлы удалив из имени все символы до и после PA-XXXX если они есть.
А если в папке уже есть файл с таким же именем, добавить к имени счетчик.

НУЖНО
PA-1312.PDF
PA-1513.PDF
PA-6734.PDF
PA-6734 1.PDF
PA-5617.PDF


Заранее ОГРОМНОЕ СПАСИБО за помощь.


Удалить ДО PA-XXXX (подсмотренно у Iska)

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=D:\Otchet

2>nul pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (
`2^>nul dir /b /a:-d`
) do (
set sVar=%%~i
ren "%%~i" "!sVar:*PA-=!"
)
popd
) || (
echo Can't find source folder [%sSourceFolder%]
exit /b 1
)

endlocal
exit /b 0

Georgio 01-08-2016 00:24 2655834

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set "sSourceFolder=D:\Otchet"

2>nul pushd "%sSourceFolder%" && (
 for /f "usebackq delims=" %%i in (
  `2^>nul dir /b /a:-d`
 ) do (
  set sVar=%%~ni
  set sVar=!sVar:*PA-=!
  call :sub "%%i" "PA-!sVar:~,4!%%~xi"
 )
 popd
) || (
 echo Can't find source folder [!sSourceFolder!]
 exit /b 1
)

endlocal
exit /b 0

:sub
 (
  2>nul ren %1 %2
 ) || (
  set /a i+=1
  call :sub %1 "PA-!sVar:~,4! !i!%~x2"
 )
 set i=
 exit /b 0


Iska 01-08-2016 05:30 2655844

LukAleX, попробуйте так (WSH):
Скрытый текст
Код:

Option Explicit

Dim strSourceFolder
Dim strFileNamePattern

Dim objFSO
Dim objFile

Dim strNewFileName

Dim strTempFolder
Dim iCount


strSourceFolder    = "C:\Мои проекты\0001"
strFileNamePattern = ".*(PA\-.{4}).*(\.pdf)"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strSourceFolder) Then
        With WScript.CreateObject("VBScript.RegExp")
                .IgnoreCase = True
                .Pattern    = strFileNamePattern
               
                strTempFolder = objFSO.CreateFolder(GetTemporaryName()).Path
               
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        If .Test(objFile.Name) Then
                                With .Execute(objFile.Name).Item(0).Submatches
                                        strNewFileName = objFSO.BuildPath(strTempFolder, .Item(0) & .Item(1))
                                        iCount = 2
                                       
                                        Do While objFSO.FileExists(strNewFileName)
                                                strNewFileName = objFSO.BuildPath(strTempFolder, .Item(0) & "-" & CStr(iCount) & .Item(1))
                                                iCount = iCount + 1
                                        Loop
                                       
                                        objFile.Move strNewFileName
                                End With
                        End If
                Next
               
                objFSO.MoveFile objFSO.BuildPath(strTempFolder, "*.*"), strSourceFolder
                objFSO.DeleteFolder strTempFolder, True
        End With
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
' Серый форум / vbscript: генерация пути для временного файла или папки
' (http://forum.script-coding.com/viewtopic.php?id=1221)
'=============================================================================
Function GetTemporaryName()
        Const TemporaryFolder = 2
       
        Dim strTempName
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                Do
                        strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
                Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
        End With
       
        GetTemporaryName = strTempName
End Function
'=============================================================================


Нумерацию я таки сделал с двойки, а не с единицы.

LukAleX 01-08-2016 11:16 2655882

Можно было бы 100 раз тыкнуть в "полезное сообщение", клянусь тыкнул бы.
Спасибо ОГРОМНОЕ за помощь. Все работает отлично.


Время: 22:20.

Время: 22:20.
© OSzone.net 2001-