Войти

Показать полную графическую версию : [решено] Пакетное переименование файлов с отсечением лишнего в имени.


LukAleX
31-07-2016, 18:42
Здравствуйте, помогите пожалуйста.
Столкнулся с проблемой. Есть папка в неё сыплются файлы, очень много файлов, с именами вида

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

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



@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
@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
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
Можно было бы 100 раз тыкнуть в "полезное сообщение", клянусь тыкнул бы.
Спасибо ОГРОМНОЕ за помощь. Все работает отлично.




© OSzone.net 2001-2012