Войти

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


shao
01-07-2010, 09:45
Есть ли возможность с помощью скрипта реализовать такую задачу :

Есть группа файлов, много.Файлов много, руками долго и нудно...
Необходимо редактирование названия фалов, путём удаления части текста из названия.
Эта часть текста у всех файлов одинаковая.
Например:

luna_msstyles_BLUE_USERTILEBACKGROUND_BMP.bmp

luna_msstyles_BLUE_TREEEXPANDCOLLAPSE_BMP.bmp

Нужно удалить у группы файлов выделенную часть текста. выделенное курсивом - оставить.
И так во всех файлах.
Подскажите пожалуйста как сделать.

З.Ы. Если возможно - желательно пакетным файлом (bat/cmd)

deepred
01-07-2010, 10:28
Самый простой способ
*для случаев когда первая часть имени разная, но содержит одинаковое число символов, например 45fad7da5dfr7eyr4tr7gfr. name.*

Echo off&Chcp 866&SetLocal EnableDelayedExpansion

set $DSF=F:\dr_0014\*.bmp & rem папка с твоими файлами и тип файла
for /f %%a in ('Dir /b %$DSF%') do (set $SFN=%%a & ren !$SFN! !$SFN:~19! )
rem "~19" число первых символов в имени под обрезку
pause
endlocal & goto :eof

Второй способ:
*с указанием заменяемого текста в имени файлов

Echo off&Chcp 866&SetLocal EnableDelayedExpansion

set $DSF=F:\dr_0014\*.bmp
set del=luna_msstyles_BLUE_
for /f %%a in ('Dir /b %$DSF%') do (set $SFN=%%a & ren !$SFN! !$SFN:%del%=! )
pause
endlocal & goto :eof

El Sanchez
01-07-2010, 11:34
shao,


@Echo Off
Set Source=C:\Source\*.bmp

For %%A In ("%Source%") Do (
For /F "Tokens=4 Delims=_" %%B In ("%%A") Do (
Ren "%%A" %%B.bmp
)
)

shao
02-07-2010, 17:46
deepred, El Sanchez, спасибо буду пробовать. Потом отпишусь.
Единственное ,El Sanchez, не понятно в Вашем скрипте , где часть текста , которая удаляется !

Эта , выделенная ? :

@Echo Off
Set Source=C:\Source\*.bmp

For %%A In ("%Source%") Do (
For /F "Tokens=4 Delims=_" %%B In ("%%A") Do (
Ren "%%A" %%B.bmp
)
)

Как я понял, вместо C:\Source указываю свой путь , а что ещё ?

deepred, попробовал Ваш второй скрипт.

Вот...
http://i074.radikal.ru/1007/53/19ab0330b4ff.jpg

Видимо я что-то не так делаю.

El Sanchez
02-07-2010, 20:55
Как я понял, вместо C:\Source указываю свой путь , а что ещё ? »

Больше нигде, только путь поменять.

Единственное ,El Sanchez, не понятно в Вашем скрипте , где часть текста , которая удаляется ! »

Первый цикл For %%A In ("%Source%") Do выдаст поочередно в переменную %%A полный путь и имя файла bmp, цикл в цикле For /F "Tokens=4 Delims=_" %%B In ("%%A") Do разобъет %%A на подстроки, разделенные символом _ (как видно из luna_msstyles_BLUE_USERTILEBACKGROUND_BMP.bmp, имя файла можно разбить на подстроки, разделенные _, и в данном случае нас интересует 4-я подстрока, ее же и фильтруем, указывая for-у - "Tokens=4"(берем только 4-й токен) и Delims=_ (указываем разделитель подстрок)) и присвоит переменной %%B нужный 4-й токен. В итоге имеем полный путь к файлу и нужное новое имя, команда же Ren "%%A" %%B.bmp переименует файл.

shao
03-07-2010, 00:04
El Sanchez, Отлично ! Спасибо за скрипт и за подробное разъяснение !


А как будет выглядеть скрипт , если отсутствует разделительный знак "_" ?
Например:

Shell32.backup USERTILEBACKGROUND.bmp

deepred
03-07-2010, 02:13
такая же тема, но *****.vbs
Option Explicit
Dim objFSO, objFile
Dim strPath2SourceFolder, strSourceName
Dim intPrefix, strobjFileName, strobjFileExtension
Dim intErrLevel

strPath2SourceFolder = "F:\2\part_name\dir_0014"
strSourceName="luna_msstyles_BLUE_"
intPrefix = Len(strSourceName)
intErrLevel = 0

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strPath2SourceFolder) Then
For Each objFile In objFSO.GetFolder(strPath2SourceFolder).Files
If UCase(Left(objFile.Name, intPrefix)) = UCase(strSourceName) Then
strobjFileName = Replace(objFSO.GetBaseName(objfile.Name), strSourceName, "",1)
strobjFileExtension = Mid(objFSO.GetExtensionName(objFile.Name),1)

objFile.COPY strPath2SourceFolder & "\" & strobjFileName & "." & strobjFileExtension
objFile.Delete
End If
Next
Else
WScript.Echo "Source folder [" & strPath2SourceFolder & "] is not exists."
intErrLevel = 1
End If
Set objFSO = Nothing
WScript.Quit intErrLevel


и последний *.bat

Echo on&Chcp 866&SetLocal EnableDelayedExpansion&cls

set $DSF=F:\2\part_name\dir_0014\*.bmp
set del1=luna_msstyles_BLUE_
set del2=_BMP

for %%a in ("%$DSF%") do call :action "%%a" "%%~nxa"
pause & goto :eof

:action
set $SFN=%~1 && set $SFNn=%~2 && set $SFNn=!$SFNn:%del1%=! && set $SFNn=!$SFNn:%del2%=!
ren %$SFN% %$SFNn%
endlocal & goto :eof

shao
03-07-2010, 02:40
такая же тема, но *****.vbs »
и последний *.bat »

Спасибо ! Работает. Этот скрипт более универсальней, но в нем удаляется только часть названия

luna_msstyles_BLUE_, а
_BMP остаётся...

Удаляемая часть названия не есть сплошная, а разделена , собственно самим названием , которое нужно оставить....

shao
03-07-2010, 09:18
и последний *.bat »

Спасибо! Всё работает!
Вопрос решён.

El Sanchez
03-07-2010, 10:44
А как будет выглядеть скрипт , если отсутствует разделительный знак "_" ?
Например:
Shell32.backup USERTILEBACKGROUND.bmp »

Здесь уже разделителем является пробел, который делит строку на 2 подстроки, нужный токен - 2 (Tokens=2). Delims в for-e можно явно и не указывать, т.к. пробел - это разделитель по-умолчанию и других символов-разделителей в данном случае не используется, по-этому:


@Echo Off
Set Source=C:\Source\*.bmp

For %%A In ("%Source%") Do (
For /F "Tokens=2" %%B In ("%%A") Do (
Ren "%%A" %%B.bmp
)
)

deepred
03-07-2010, 12:20
shao,

оба кода и *.vbs и *.bat работают (проверено на WinVista OS) независимо от разделителей и оба можно переделать под вызов из cmd, чтобы каждый раз не редактировать код


Option Explicit
Dim objFSO, objFile
Dim strPath2SourceFolder, strSourceName, strSourceEnd
Dim intPrefix, intpostfix, strobjFileName, strobjFileExtension
Dim intErrLevel

strPath2SourceFolder = "F:\2\part_name\dir_0014"
strSourceName="luna_msstyles_BLUE_"
strSourceEnd="_BMP"
intPrefix = Len(strSourceName)
intpostfix = Len(strSourceEnd)
intErrLevel = 0

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strPath2SourceFolder) Then
For Each objFile In objFSO.GetFolder(strPath2SourceFolder).Files
If UCase(Left(objFile.Name, intPrefix)) = UCase(strSourceName) Then
strobjFileName = Replace(objFSO.GetBaseName(objfile.Name), strSourceName, "",1)
strobjFileName = Replace(strobjFileName, strSourceEnd, "",1)
strobjFileExtension = Mid(objFSO.GetExtensionName(objFile.Name),1)

objFile.COPY strPath2SourceFolder & "\" & strobjFileName & "." & strobjFileExtension
objFile.Delete
End If
Next
Else
WScript.Echo "Source folder [" & strPath2SourceFolder & "] is not exists."
intErrLevel = 1
End If
Set objFSO = Nothing
WScript.Quit intErrLevel



shao ты просил пояснения...

код El Sanchez - отличный код, очень лаконичный, но не сработает если в названиях папок пути будут присутствовать "delims", поэтому маленький upgrade:

For %%A In ("%Source%") Do (
For /F "Tokens=2" %%B In ("%%~nA") Do (
Ren "%%A" %%B.%%~xA))

справка в cmd - for /?

подсказка...
http://www.windowsfaq.ru/content/category/3/19/57/
http://forum.oszone.net/post-1444713-12.html
http://www.script-coding.info/WSH.html

El Sanchez
03-07-2010, 12:50
deepred,

For %%A In ("%Source%") Do (
For /F "Tokens=2" %%B In ("%%~nA") Do (
Ren "%%A" %%B.%%~xA)) »

Согласен. Так будет правильней. :yes:

Upd: точней Ren "%%A" %%B%%~xA (без точки)




© OSzone.net 2001-2012