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

Fresh96 15-01-2014 14:08 2289625

Переименовать файлы (заменить часть имени)
 
Здравствуйте.
Есть папка с файлами. Имена файлов следующие(для примера):
Код:

ПС02.ПА_2014.01.12_b.docx
ПС02.С10_2014.01.10_b.docx
ПС02.С7_2014.01.13_b.docx
ПС02.С6.1_2014.01.05_u.docx
ПС02.ПЭ3_2014.01.01_u.pdf

Нужно с помощью bat'ника заменить дату у всех файлов на текущую и в конце имени букву "b" заменить на "u".
Должно получится следующее:
Код:

ПС02.ПА_2014.01.15_u.docx
ПС02.С10_2014.01.15_u.docx
ПС02.С7_2014.01.15_u.docx
ПС02.С6.1_2014.01.15_u.docx
ПС02.ПЭ3_2014.01.15_u.pdf

Помогите bat-кодом.

ОС Win7

Iska 15-01-2014 14:19 2289634

Цитата:

Цитата Fresh96
заменить дату »

Какую именно?

Цитата:

Цитата Fresh96
и в конце имени букву "b" заменить на "u" »

Что делать, если окажется, что файл с таким именем уже существует?

Fresh96 15-01-2014 14:40 2289653

Дату в имени файла. Например ПС02.ПА_2014.01.12_b.docx (формат ГГГГ.ММ.ДД)

Цитата:

Цитата Iska
Что делать, если окажется, что файл с таким именем уже существует? »

теоретически такого быть не должно, но практически такое может произойти. Предлагаю в этом случае не переименовывать файл или добавить цифру, например u2 (или Ваш вариант?).

Iska 15-01-2014 16:05 2289690

Цитата:

Цитата Fresh96
Дату в имени файла. Например ПС02.ПА_2014.01.12_b.docx (формат ГГГГ.ММ.ДД) »

Ясно. Не доглядел.

Попробуйте так (на WSH):
читать дальше »
Код:

Option Explicit

Dim strSourceFolder

Dim dtNow
Dim strNow

Dim objDictionary
Dim objRegExp
Dim objFile

Dim strKey


strSourceFolder = "E:\Песочница\0352"

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FolderExists(strSourceFolder) Then
                dtNow  = Now()
                strNow = Year(dtNow) & "." & Right("00" & CStr(Month(dtNow)), 2) & "." & Right("00" & CStr(Day(dtNow)), 2)
               
                Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
               
                Set objRegExp    = WScript.CreateObject("VBScript.RegExp")
                objRegExp.Pattern = "^(.+?)(\d{4}\.\d{2}\.\d{2})(.+)$"
               
                For Each objFile In .GetFolder(strSourceFolder).Files
                        If objRegExp.Test(objFile.Name) Then
                                objDictionary.Add objFile.Name, objRegExp.Replace(objFile.Name, "$1" & strNow & "$3")
                        End If
                Next
               
                objRegExp.Pattern = "^(.+)b$"
               
                For Each strKey In objDictionary.Keys
                        If objRegExp.Test(.GetBaseName(objDictionary.Item(strKey))) Then
                                objDictionary.Item(strKey) = objRegExp.Replace(.GetBaseName(objDictionary.Item(strKey)), "$1u." & .GetExtensionName(objDictionary.Item(strKey)))
                        End If
                Next
               
                Randomize Timer
               
                For Each strKey In objDictionary.Keys
                        Do Until Not .FileExists(.BuildPath(strSourceFolder, objDictionary.Item(strKey)))
                                objDictionary.Item(strKey) = .GetBaseName(objDictionary.Item(strKey)) & "_" & Left(CStr(Rnd() * 10000), 4) & "." & .GetExtensionName(objDictionary.Item(strKey))
                        Loop
                       
                        .GetFile(.BuildPath(strSourceFolder, strKey)).Name = objDictionary.Item(strKey)
                Next
        Else
                WScript.Echo "Source folder [" & strSourceFolder & "] not found."
                WScript.Quit 1
        End If
End With

WScript.Quit 0


Fresh96 15-01-2014 18:26 2289792

Iska, огромное спасибо. Все работает.


Время: 13:02.

Время: 13:02.
© OSzone.net 2001-