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

shao 01-07-2010 09:45 1445043

Редактирование текста названия
 
Есть ли возможность с помощью скрипта реализовать такую задачу :

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

Код:

luna_msstyles_BLUE_USERTILEBACKGROUND_BMP.bmp

luna_msstyles_BLUE_
TREEEXPANDCOLLAPSE_BMP.bmp

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

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

deepred 01-07-2010 10:28 1445071

Самый простой способ
*для случаев когда первая часть имени разная, но содержит одинаковое число символов, например 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 1445124

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 1446124

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, попробовал Ваш второй скрипт.

Вот...


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

El Sanchez 02-07-2010 20:55 1446228

Цитата:

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

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

Цитата:

Цитата shao
Единственное ,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 1446319

El Sanchez, Отлично ! Спасибо за скрипт и за подробное разъяснение !


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

Shell32.backup USERTILEBACKGROUND.bmp

deepred 03-07-2010 02:13 1446363

такая же тема, но *****.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 1446366

Цитата:

Цитата deepred
такая же тема, но *****.vbs »

Цитата:

Цитата deepred
и последний *.bat »

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

Код:

luna_msstyles_BLUE_
, а
Код:

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

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

shao 03-07-2010 09:18 1446402

Цитата:

Цитата deepred
и последний *.bat »

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

El Sanchez 03-07-2010 10:44 1446428

Цитата:

Цитата shao
А как будет выглядеть скрипт , если отсутствует разделительный знак "_" ?
Например:
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 1446463

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 1446476


deepred,

Цитата:

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

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

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


Время: 21:04.

Время: 21:04.
© OSzone.net 2001-