VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Аватара пользователя
serg515

VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение serg515 »

Есть большое количество текстовых файлов в папке.

Как лучше и быстрее переименовать такое кол-во файлов средствами .vbs

Можно и .bat, но первое вроде бы быстрее работает.

Чтобы новые имена были от 1 и выше,в формате с одной цифрой.(т.е. не 01,или 001, а 1).
Аватара пользователя
serg515

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение serg515 »

serg515, вообще, подобные одноразовые вещи быстрее и проще делать полуавтоматически либо сторонними файловыми менеджерами, либо специализированными средствами.




Цитата serg515:



Можно и .bat, но первое вроде бы быстрее работает.
VBS/WSH/JS - Массовое переименование файлов со счётчиком.




Да нет, в данном случае особой разницы Вы не увидите.



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@echo off
setlocal enableextensions enabledelayedexpansion
set /a iCount = 0
for /f "usebackq delims=" %%i in (`dir /b /a:-d "*.txt"`) do (
	set /a iCount += 1
	ren "%%~i" "!iCount!%%~xi"
)
endlocal
exit /b 0







Другое дело, что в именах файлов могут встретиться символы, которые окажутся не по зубам такому пакетному файлу. Посему — да, можно и WSH/PoSH:



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

Get-ChildItem -Path '*.txt' | ForEach-Object -Begin {
        $iCount = 0
    } -Process {
        Rename-Item -Path $_.FullName -NewName "$((++$iCount))$($_.Extension)"
    }







И Вы ничего не сказали, что делать, если там уже[/i] окажутся файлы с такими «нумерованными» именами.
Аватара пользователя
serg515

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение serg515 »

Код:

Код: Выделить всё

@Echo Off
	Set "BoxIn=Z:\Soft_In"
	Set "Mask=*.txt"
	For %%i In ("%BoxIn%\%Mask%") Do (Set "Ext=%%~xi" &Ren "%%i" "%%~nxi.~~tmp~~")
	Set /A N=0
	For %%i In ("%BoxIn%\*%Ext%.~~tmp~~") Do (
		Set /A N+=1 &Call Ren "%%i" "%%N%%%Ext%"
	)
Exit /B

И всё равно, были ли там нумерованные имена или нет, все переименуем заново.
Аватара пользователя
megaloman

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение megaloman »

Цитата Iska:



И Вы ничего не сказали, что делать, если там уже окажутся файлы с такими «нумерованными» именами.
VBS/WSH/JS - Массовое переименование файлов со счётчиком.




переименовать всё.
Аватара пользователя
serg515

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение serg515 »

Цитата megaloman:



@Echo Off

Set "BoxIn=Z:\Soft_In"

Set "Mask=*.txt"

For %%i In ("%BoxIn%\%Mask%") Do (Set "Ext=%%~xi" &Ren "%%i" "%%~nxi.~~tmp~~")

Set /A N=0

For %%i In ("%BoxIn%\*%Ext%.~~tmp~~") Do (

Set /A N+=1 &Call Ren "%%i" "%%N%%%Ext%"

)

Exit /B
VBS/WSH/JS - Массовое переименование файлов со счётчиком.




работает.по времени похоже на total commander.

может есть аналогичное в vbs ?
Аватара пользователя
serg515

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение serg515 »

serg515, можно ещё однострочник PS попробовать:



Код:

Код: Выделить всё

dir *.txt | % {$i=1} {ren $_ -NewName ("{0:D1}.txt" -f $i++)}
Аватара пользователя
Uragan66

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение Uragan66 »

Цитата Uragan66:



dir *.txt | % {$i=1} {ren $_ -NewName ("{0:D1}.txt" -f $i++)}
VBS/WSH/JS - Массовое переименование файлов со счётчиком.




к сожалению если существуют файлы с такими числовыми имена возникает ошибка
Аватара пользователя
serg515

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение serg515 »

vbs

[spoiler]Код:
[/spoiler]

Код: Выделить всё

MyDir = "Z:\Soft_In"
Ext = "txt"
MyMask = "^.*\." + Ext + "$"
Set Reg = CreateObject("VBScript.RegExp")
Reg.IgnoreCase = True
Reg.Pattern = MyMask
With CreateObject("Scripting.FileSystemObject")
    Set Files = .GetFolder(MyDir).Files
    For Each File In Files
        FilePath = File.Path
        If Reg.Test(FilePath) Then
            .MoveFile FilePath, FilePath + ".~~~tmp~~~"
        End If
    Next
    Set Files = .GetFolder(MyDir).Files
    Reg.Pattern = "^.*\.~~~tmp~~~$"
    N = 0
    For Each File In Files
        FilePath = File.Path
        If Reg.Test(FilePath) Then
            N = N + 1
            .MoveFile FilePath, File.ParentFolder + "\" + CStr(N) + "." + Ext
        End If
    Next
End With
MsgBox "Done"





В ~2раза быстрее моего CMD. Переименовываю все файлы с указанным расширением. Если бы была гарантия, что все исходные файлы если и имеют цифровые имена, но более числа файлов, то переименование можно было бы сделать еще в 2 раза быстрее. В противном случае вижу только такое решение, реализованное в моих CMD и VBS: переименовывать дважды.
Аватара пользователя
megaloman

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение megaloman »

Цитата megaloman:



…переименовывать дважды.
VBS/WSH/JS - Массовое переименование файлов со счётчиком.




Ну, можно ещё сначала переместить во временный каталог, а затем перемещать по одному в другой временный каталог, там переименовывать в очередное имя, а затем перемещать вобрат в исходное местоположение, и в конце удалять оба уже пустых временных каталога — это гарантирует отсутствие проблем с наложением имён даже без проверки. Но тут надо смотреть — не потеряются ли разрешения безопасности на файлы.
Аватара пользователя
Iska

Re: VBS/WSH/JS - Массовое переименование файлов со счётчиком.

Сообщение Iska »

Цитата Iska:



оба уже пустых временных каталога
VBS/WSH/JS - Массовое переименование файлов со счётчиком.




ИМХО, слишком много временных каталогов, хватает одного.

Код:

Код: Выделить всё

@Echo Off
	Set "BoxIn=Z:\Soft_In"
	Set "Mask=*.txt"
	Set "MyTMP=%BoxIn%\%~nx0.tmp"
	2>nul Rd /Q /S "%MyTMP%"
	Md "%MyTMP%"	
	Set /A N=0
	For %%i In ("%BoxIn%\%Mask%") Do (Set /A N+=1 &>nul Call Move "%%i" "%MyTMP%\%%N%%%%~xi")
	>nul Move "%MyTMP%\*.*" "%BoxIn%\"
	Rd /Q /S "%MyTMP%"
Exit /B

Я раньше тоже предполагал такой вариант, решил, что он будкт медленнее, но по времени одно и то же.

Кстати, в vbs пришлось делать именно Move, переименовать файл я не умею.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»