<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: Переименование файлов с использованием регулярных выражений]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5347&amp;type=atom" />
	<updated>2014-07-29T19:41:37Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=5347</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Переименование файлов с использованием регулярных выражений]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=85391#p85391" />
			<content type="html"><![CDATA[<p>Развитие скрипта получило продолжение уже в виде исполняемого файла<br /><a href="http://www.cyberforum.ru/cmd-bat/thread1226601.html">http://www.cyberforum.ru/cmd-bat/thread1226601.html</a></p>]]></content>
			<author>
				<name><![CDATA[Smitis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5649</uri>
			</author>
			<updated>2014-07-29T19:41:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=85391#p85391</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Переименование файлов с использованием регулярных выражений]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=50302#p50302" />
			<content type="html"><![CDATA[<p>Второй скрипт.<br />Версия с дополнительной фильтрацией по маске файлов/папок.<br />Также может добавлять произвольный текст в начало и/или в конец имени, без обработки файлов/папок регулярными выражениями.</p><p>vrenm.vbs<br /></p><div class="codebox"><pre><code>&#039; Переименование файлов с использование регулярных выражений
&#039; Расширения файлов не изменяются!
&#039; Для папок, в отличии от файлов, расширения не имеют для системы значения, поэтому их имена обрабатываются целиком.

&#039; 2011.07.31 - v.3.05

&#039; На основе vrenn.vbs (нумерация версий та же)
&#039; Отличия - первый параметр - маска файлов

Option Explicit
On Error Resume Next

Dim x

Dim fso, shl, rex, mat, shap
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set shl = CreateObject(&quot;WScript.Shell&quot;)
Set rex = New RegExp
Set shap = CreateObject(&quot;Shell.Application&quot;)

&#039; Аргументы
Dim p_xn, p_mask, p_find, p_with
Dim p_quiet, p_pause, p_test
Dim p_sens, p_glob, p_descr
Dim p_prefix, p_suffix
Dim p_files, p_folders
Dim p_move, p_m_c, p_dest
p_xn = 0
p_mask = &quot;&quot;
p_find = &quot;&quot; &#039; Что ищем
p_with = &quot;&quot; &#039; На что меняем
p_quiet = 0
p_pause = True
p_test = False
p_sens = False
p_glob = True
p_descr = True
p_files = True
p_folders = False
p_prefix = &quot;&quot;
p_suffix = &quot;&quot;
p_move = False
p_m_c = False
p_dest = &quot;&quot;

Dim a, au, args

If WScript.Arguments.Count = 0 Then
    HELP
    WScript.Quit
End If

&#039; Разбор аргументов командной строки с именами
Set args = WScript.Arguments.Named
If args.Exists(&quot;Q&quot;) Then
    p_quiet = 2
    p_pause = False
End If
If args.Exists(&quot;Q1&quot;) Then
    &#039; Вывести только результирующую информацию
    p_quiet = 1
End If
If args.Exists(&quot;Q2&quot;) Then
    &#039; Без паузы
    p_pause = False
End If
If args.Exists(&quot;T&quot;) Then
    &#039; Тестирование (вывод результатов без реального переименования)
    p_test = True
End If
If args.Exists(&quot;CS&quot;) Then
    &#039; case sense
    p_sens = True
End If
If args.Exists(&quot;ND&quot;) Then
    p_descr = False
End If
If args.Exists(&quot;1&quot;) Then
    &#039; Только одну замену в имени
    p_glob = False
End If
If args.Exists(&quot;F&quot;) Then
    &#039; Обрабатывать только папки
    p_files = False
    p_folders = True
End If
If args.Exists(&quot;FF&quot;) Then
    &#039; Обрабатывать и файлы и папки
    p_files = True
    p_folders = True
End If
If args.Exists(&quot;P&quot;) Then
    &#039; Префикс - добавить произвольный текст в начало имени
    p_prefix = args.Item(&quot;P&quot;)
End If
If args.Exists(&quot;S&quot;) Then
    &#039; Суффикс - добавить произвольный текст в конец имени
    p_suffix = args.Item(&quot;S&quot;)
End If
If args.Exists(&quot;M&quot;) Then
    &#039; MOVE - переместить в папку
    p_move = True
    p_m_c = True
    p_dest = args.Item(&quot;M&quot;)
End If
If args.Exists(&quot;C&quot;) Then
    &#039; COPY - копировать в папку
    p_move = False
    p_m_c = True
    p_dest = args.Item(&quot;C&quot;)
End If

&#039; Разбор аргументов командной строки без имён
Set args = WScript.Arguments.Unnamed
For Each a In args
    au = UCase(Left(a,2))
    If p_xn &lt; 1 Then
        &#039; маска
        p_mask = a
        p_xn = 1
    ElseIf p_xn &lt; 2 Then
        &#039; регулярное выражение
        p_find = a
        p_xn = 2
    ElseIf p_xn &lt; 3 Then
        &#039; строка замены
        If a = &quot;\&quot; Then &#039; Пустая строка
            a = &quot;&quot;
        End If
        p_with = a
        p_xn = 3
    Else
        &#039; Неправильный параметр
        HELP
        WScript.Echo &quot;ERROR: -1&quot;
        WScript.Quit -1
    End If
Next

If p_xn = 1 And (Len(p_prefix)+Len(p_suffix)) &gt; 0 Then
    &#039; Задана только маска файлов, но при этом задан суффикс и/или префикс
    &#039; Поэтому задаём фиктивные патерн и замену
    p_find = &quot;(.)&quot;
    p_with = &quot;$1&quot;
    p_glob = False
    p_xn = 3
End If
If p_xn &lt; 3 Or Len(p_find) = 0 Then
    &#039; Недостаточно аргументов
    &#039; или пустой патерн
    HELP
    WScript.Echo &quot;ERROR: -2&quot;
    WScript.Quit -2
End If

rex.Pattern = p_find
rex.IgnoreCase = Not p_sens
rex.Global = p_glob

&#039; Проверка правильности регулярного выражения
Err.Clear
rex.Test(&quot;A&quot;)
ERRQ -4

&#039; Чтение описаний
Dim des
If p_descr Then
    Set des = New descr
    des.load
End If

&#039; Папка назначения при перемещении или копировании
Dim ddes
If p_m_c Then
    If Len(p_dest) = 0 Then
        HELP
        WScript.Quit -1
    End If
    If Right(p_dest,1)=&quot;\&quot; Then
        p_dest = Left(p_dest,Len(p_dest)-1)
    End If
    If Not p_test Then
        If Not fso.FolderExists(p_dest) Then
            Err.Clear
            fso.CreateFolder p_dest
            ERRQ -5
        End If
        Set ddes = New descr
        ddes.setpath p_dest
        ddes.load
    End If
    p_dest = p_dest &amp; &quot;\&quot;
End If

Dim f1, f2, fn1, fn2, fx, fxx

Dim ne, nf, nd, na &#039; Счётчики
Dim f, ff, fc
Dim fa()
ne = 0
nf = 0
nd = 0

&#039; [?] Обязательно ли дублировать Set fc ?
&#039; Т.е., изменится ли список для файлов после переименования папок?
&#039; Set fc = shap.NameSpace(shl.CurrentDirectory).Items()

If p_folders Then
    &#039; Обработка папок
    na = 0
    Set fc = shap.NameSpace(shl.CurrentDirectory).Items()
    fc.Filter 32, p_mask
    For Each f In fc
        f1 = f
&#039;       Set mat = rex.Execute(f1)
&#039;       If mat.count Then
        If rex.Test(f1) Then
            If p_xn = 2 Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    Next
    If na Then
        If Not p_m_c Then
            For Each f1 In fa
                f2 = p_prefix &amp; Trim(rex.Replace(f1,p_with)) &amp; p_suffix
                If f1 &lt;&gt; f2 Then
                    &#039; Папка требует переименования
                    If p_quiet = 0 Then
                        WScript.Echo f1
                        WScript.Echo &quot;-&gt; &quot; &amp; f2
                    End If
                    nf = nf+1
                    If Not p_test Then
                        Err.Clear
                        fso.MoveFolder f1, f2
                        &#039;Set ff = fso.GetFolder(f1) &#039; Другой способ
                        &#039;Err.Clear
                        &#039;ff.Name = f2
                        If Err.Number &lt;&gt; 0 Then
                            ne = ne+1
                            ERRW
                        ElseIf p_descr Then
                            des.move f1, f2
                        End If
                    ElseIf Len(des.getx(f1)) Then
                        nd = nd+1
                    End If
                End If
            Next
        Else &#039; move or copy
            For Each f1 In fa
                If p_quiet = 0 Then
                    WScript.Echo f1
                    &#039;WScript.Echo &quot;-&gt; &quot; &amp; p_dest
                End If
                nf = nf+1
                If Not p_test Then
                    Err.Clear
                    If p_move Then
                        fso.MoveFolder f1, p_dest
                    Else
                        fso.CopyFolder f1, p_dest
                    End If
                    If Err.Number &lt;&gt; 0 Then
                        ne = ne+1
                        ERRW
                    ElseIf p_descr Then
                        x = des.getx(f1)
                        If p_move Then
                            des.setx f1, &quot;&quot;
                        End If
                        ddes.setx f1, x
                    End If
                ElseIf Len(des.getx(f1)) Then
                    nd = nd+1
                End If
            Next
        End If
    End If
End If

If p_files Then
    &#039; Обработка файлов
    na = 0
    Set fc = shap.NameSpace(shl.CurrentDirectory).Items()
    fc.Filter 64, p_mask
    For Each f In fc
        f1 = f
        x = InStrRev(f1,&quot;.&quot;)
        If x&gt;1 Then
            fn1 = Left(f1,x-1)
            fx = Mid(f1,x)
        Else
            fn1 = f1
            fx = &quot;&quot;
        End If
&#039;       Set mat = rex.Execute(fn1)
&#039;       If mat.count Then
        If rex.Test(fn1) Then
            If p_xn = 2 Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    Next
    If na Then
        If Not p_m_c Then
            For Each f1 In fa
                x = InStrRev(f1,&quot;.&quot;)
                If x&gt;1 Then
                    fn1 = Left(f1,x-1)
                    fx = Mid(f1,x)
                    fxx = UCase(Mid(f1,x+1))
                Else
                    fn1 = f1
                    fx = &quot;&quot;
                    fxx = &quot;&quot;
                End If
                fn2 = p_prefix &amp; Trim(rex.Replace(fn1,p_with)) &amp; p_suffix
                f2 = fn2 &amp; fx
                If fn1 &lt;&gt; fn2 Then
                    &#039; Файл требует переименования
                    If p_quiet = 0 Then
                        WScript.Echo f1
                        WScript.Echo &quot;-&gt; &quot; &amp; f2
                    End If
                    nf = nf+1
                    If Not p_test Then
                        Err.Clear
                        fso.MoveFile f1, f2
                        &#039;Set ff = fso.GetFile(f1) &#039; Другой способ
                        &#039;Err.Clear
                        &#039;ff.Name = f2
                        If Err.Number &lt;&gt; 0 Then
                            ne = ne+1
                            ERRW
                        ElseIf p_descr Then
                            des.move f1, f2
                        End If
                    ElseIf Len(x) Then
                        nd = nd+1
                    End If
                End If
            Next
        Else &#039; move or copy
            For Each f1 In fa
                If p_quiet = 0 Then
                    WScript.Echo f1
                    &#039;WScript.Echo &quot;-&gt; &quot; &amp; p_dest
                End If
                nf = nf+1
                If Not p_test Then
                    Err.Clear
                    If p_move Then
                        fso.MoveFile f1, p_dest
                    Else
                        fso.CopyFile f1, p_dest
                    End If
                    If Err.Number &lt;&gt; 0 Then
                        ne = ne+1
                        ERRW
                    ElseIf p_descr Then
                        x = des.getx(f1)
                        If p_move Then
                            des.setx f1, &quot;&quot;
                        End If
                        ddes.setx f1, x
                    End If
                ElseIf Len(des.getx(f1)) Then
                    nd = nd+1
                End If
            Next
        End If
    End If
End If

If p_quiet &lt; 2 Then
    WScript.Echo &quot;FOUND:  &quot; &amp; nf
    If p_xn &gt; 2 Or p_m_c Then
        &#039; Если не вывод списка, а переименование/перемещение/копирование
        WScript.Echo &quot;ERRORS: &quot; &amp; ne
    End If
End If
If p_descr Then
    If p_m_c Then
        ddes.save
    End If
    If Not p_test Then
        nd = des.dc
    End If
    des.save
    If p_quiet &lt; 2 Then
        WScript.Echo &quot;DESCR:  &quot; &amp; nd
    End If
End If
If p_pause Then
    WScript.StdOut.Write &quot;Press ENTER key to continue . . .&quot;
    x = WScript.StdIn.Read(1)
End If

WScript.Quit ne

&#039;----------------------------------------------------------------------------------------------------------
Sub HELP
    WScript.Echo &quot;Using:&quot;
    WScript.Echo &quot;  vrenm mask patern&quot;
    WScript.Echo &quot;  - list&quot;
    WScript.Echo &quot;or&quot;
    WScript.Echo &quot;  vrenm [options] mask patern replace&quot;
    WScript.Echo &quot;  - rename&quot;
    WScript.Echo &quot;or&quot;
    WScript.Echo &quot;  vrenm [options] mask patern /M:folder&quot;
    WScript.Echo &quot;  - move to folder&quot;
    WScript.Echo &quot;or&quot;
    WScript.Echo &quot;  vrenm [options] mask patern /C:folder&quot;
    WScript.Echo &quot;  - copy to folder&quot;
    WScript.Echo &quot;where:&quot;
    WScript.Echo &quot;  mask    - file masks separated by &#039;;&#039; character&quot;
    WScript.Echo &quot;            samples:&quot;
    WScript.Echo &quot;              *.jpg&quot;
    WScript.Echo &quot;              *.doc;*.docx;readme.*&quot;
    WScript.Echo &quot;  patern  - regular expression patern (sintax is wsh)&quot;
    WScript.Echo &quot;  replace - regular expression replace (sintax is wsh)&quot;
    WScript.Echo &quot;options:&quot;
    WScript.Echo &quot;  /Q      - quiet (no output)&quot;
    WScript.Echo &quot;  /Q1     - output only result info&quot;
    WScript.Echo &quot;  /Q2     - without pause&quot;
    WScript.Echo &quot;  /F      - rename folders only&quot;
    WScript.Echo &quot;            or&quot;
    WScript.Echo &quot;  /FF     - rename folder and files&quot;
    WScript.Echo &quot;            otherwise rename files only&quot;
    WScript.Echo &quot;  /CS     - case sensifity&quot;
    WScript.Echo &quot;  /1      - only one match (otherwise all matches)&quot;
    WScript.Echo &quot;  /P:$    - add prefix to name&quot;
    WScript.Echo &quot;  /S:$    - add suffix to name&quot;
    WScript.Echo &quot;  /ND     - not porcess descript.ion&quot;
    WScript.Echo &quot;  /T      - testing regular expression without real rename&quot;
End Sub

&#039;----------------------------------------------------------------------------------------------------------
Sub ERRQ( cod )
    If Err.Number &lt;&gt; 0 Then
        ERRW
        If cod Then
            WScript.Quit cod
        End If
    End If
End Sub
&#039;----------------------------------------------------------------------------------------------------------
Sub ERRW
    If p_quiet = 0 Then
        WScript.Echo &quot;!! ERROR: &quot; &amp; CStr(Err.Number) &amp; &quot; - &quot; &amp; Err.Description
    End If
End Sub

&#039;==========================================================================================================
&#039; Класс для работы с descript.ion
&#039; ver. 2.05
&#039;----------------------------------------------------------------------------------------------------------

Class descr
    Public da
    Public dc
    Public dfp &#039; description full path

&#039;----------------------------------------------------------------------------------------------------------

Private Sub Class_Initialize
    setpath &quot;&quot;
    ReDim da(1,0)
    da(0,0) = &quot;&quot;
    da(1,0) = &quot;&quot;
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Private Sub Class_Terminate
    da = Null
    dfp = Null
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub setpath( p )
    With CreateObject(&quot;Scripting.FileSystemObject&quot;)
        If Len(p) = 0 Then
            dfp = .GetAbsolutePathName(&quot;descript.ion&quot;)
        Else
            dfp = .GetAbsolutePathName(p &amp; &quot;\descript.ion&quot;)
        End If
    End With
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub load
    dc = 0 &#039; Счётчик изменений сразу сбрасываем, типа, изменений ещё не было
    Dim s, x, fn, ft
    Dim i : i = 0
    Dim h
    With CreateObject(&quot;Scripting.FileSystemObject&quot;)
        If Not .FileExists(dfp) Then
            Exit Sub
        End If
        Set h = .OpenTextFile(dfp,1) &#039; ForReading
        Do While Not h.AtEndOfStream
            i = i+1
            ReDim Preserve da(1,i)
            s = Trim(h.ReadLine)
            If Left(s,1) = &quot;&quot;&quot;&quot; Then
                &#039; Имя в кавычках, ищем завершающие кавычки
                x = InStr(2,s,&quot;&quot;&quot;&quot;)
                If x Then
                    fn = Mid(s,2,x-2)
                    ft = LTrim(Mid(s,x+1))
                Else
                    fn = s
                    ft = &quot;&quot;
                End If
            Else
                &#039; Имя не в кавычках, ищем пробел
                x = InStr(s,&quot; &quot;)
                If x Then
                    fn = Left(s,x-1)
                    ft = LTrim(Mid(s,x+1))
                Else
                    fn = s
                    ft = &quot;&quot;
                End If
            End If
            &#039; Если строка неправильная, ft бедет пустым
            da(0,i) = fn
            da(1,i) = ft
        Loop
        h.Close
    End With
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Function getx( f )
    Dim i
    Dim u : u = UBound(da,2)
    Dim fu : fu = UCase(f)
    If Len(f) Then
        &#039; Описания просматриваем с конца, так как действительным является последнее.
        For i=u To 0 Step -1
            If fu = UCase(da(0,i)) Then
                getx = da(1,i)
                Exit Function
            End If
        Next
    End If
    getx = &quot;&quot;
End Function

&#039;----------------------------------------------------------------------------------------------------------

Public Sub setx( f, d )
    &#039; Нужно ли удаление дубликатов?
    &#039; Нужен ли trim для описаний?
    Dim i
    Dim u : u = UBound(da,2)
    Dim fu : fu = UCase(f)
    If Len(d) Then
        &#039; Присваивание
        &#039; Описания просматриваем с конца, так как действительным является последнее.
        dc = dc+1 &#039; Изменения всегда будут
        For i=u To 0 Step -1
            If UCase(da(0,i)) = fu Then
                &#039; Меняем описание и завершаем функцию
                da(1,i) = d
                Exit Sub
            End If
        Next
        &#039; Добавляем описание
        i = u+1
        ReDim Preserve da(1,i)
        da(0,i) = f
        da(1,i) = d
    Else
        &#039; Удаление
        For i=u To 0 Step -1
            If UCase(da(0,i)) = fu Then
                &#039; Удаляем имя и описание и завершаем функцию
                da(0,i) = &quot;&quot;
                da(1,i) = &quot;&quot;
                dc = dc+1
                Exit Sub
            End If
        Next
    End If
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub move( f1, f2 )
    Dim i
    Dim fud
    Dim fu1 : fu1 = UCase(f1)
    Dim fu2 : fu2 = UCase(f2)
    Dim fnd : fnd = False
    Dim u : u = UBound(da,2)
    If Len(f2) Then
        &#039; Переименование
        &#039; Описания просматриваем с конца, так как действительным является последнее.
        &#039; Если будут дубляжи f1 - пропускаем.
        &#039; Если будут дубляжи f2 - удаляем.
        For i=u To 0 Step -1
            fud = UCase(da(0,i))
            If fud = fu1 Then
                &#039; Меняем имя файла
                &#039; Но только один раз
                If Not fnd Then
                    da(0,i) = f2
                    dc = dc+1
                    fnd = True
                End If
            ElseIf fud = fu2 Then
                &#039; Удаляем имя и описание
                &#039; Но только если переименование уже было
                If fnd Then
                    da(0,i) = &quot;&quot;
                    da(1,i) = &quot;&quot;
                End If
            End If
        Next
    Else
        &#039; Удаление
        For i=0 To u
            fud = UCase(da(0,i))
            If fud = fu1 Then
                &#039; Удаляем имя и описание
                da(0,i) = &quot;&quot;
                da(1,i) = &quot;&quot;
                dc = dc+1
            End If
        Next
    End If
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub save
    If dc = 0 Then
        &#039; Если не было изменений нефиг и записывать
        Exit Sub
    End If
    Dim u : u = UBound(da,2)
    Dim i, s, d0, d1
    Dim n : n = 0 &#039; Счётчик записанных строк
    Dim h
    With CreateObject(&quot;Scripting.FileSystemObject&quot;)
        Set h = .OpenTextFile(dfp,2,Not .FileExists(dfp)) &#039; ForWriting
        For i=0 To u
            d0 = da(0,i)
            d1 = da(1,i)
            If Len(d0) Then
                &#039; Не пустое имя файла
                If Len(d1) Then
                    &#039; Это была правильная строка
                    If InStr(d0,&quot; &quot;) Then
                        s = &quot;&quot;&quot;&quot; &amp; d0 &amp; &quot;&quot;&quot; &quot; &amp; d1
                    Else
                        s = d0 &amp; &quot; &quot; &amp; d1
                    End If
                Else
                    &#039; Это была неправильная строка
                    s = d0
                End If
                h.WriteLine( s )
                n = n+1
            End If
        Next
        dc = 0 &#039; Изменений больше нет
        h.Close
        If n = 0 Then
            &#039; Файл пустой
            .DeleteFile dfp, True
        Else
            Set h = .GetFile(dfp)
            h.Attributes = 34
        End If
    End With
End Sub

&#039;----------------------------------------------------------------------------------------------------------

End Class

&#039;==========================================================================================================</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Smitis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5649</uri>
			</author>
			<updated>2011-07-31T14:20:48Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=50302#p50302</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Переименование файлов с использованием регулярных выражений]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=50301#p50301" />
			<content type="html"><![CDATA[<p>Очередное усовершенствование.</p><p>- Изменён ключ, всключающий чуствительность к регистру с /S на /CS (Case Sense)<br />- В начало и в конец имени можно добавлять произвольный текст (ключ /P - префикс и /S - суффикс). Причём второй скрипт, vrenm, может работать без обработки имён регулярными выражениями (патерн и замена опущены), толко добавляя префикс и/или суффикс.<br />- После обработки регулярного выражения от имени отбрасываются лидирующие и завершающие пробелы.<br />- Вывод сообщений об ошибках.<br />- Вместо переименования можно выполнить перенос (/M - move) или копирование (/C - copy) в другую папку.<br />- Пауза в конце обработки.<br />- Доработан алгоритм обработки descript.ion<br />- Режим тестирования для проверки регулярных выражений без реального переименования.</p><p>vrenn.vbs<br /></p><div class="codebox"><pre><code>&#039; Переименование файлов с использование регулярных выражений
&#039; Расширения файлов не изменяются!
&#039; Для папок, в отличии от файлов, расширения не имеют для системы значения, поэтому их имена обрабатываются целиком.

&#039; 2011.07.31 - v.3.05

Option Explicit
On Error Resume Next

Dim x

Dim fso, shl, rex, mat
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set shl = CreateObject(&quot;WScript.Shell&quot;)
Set rex = New RegExp

&#039; Аргументы
Dim p_xn, p_find, p_with
Dim p_quiet, p_pause, p_test
Dim p_sens, p_glob, p_descr
Dim p_prefix, p_suffix
Dim p_files, p_folders
Dim p_move, p_m_c, p_dest
p_xn = 0
p_find = &quot;&quot; &#039; Что ищем
p_with = &quot;&quot; &#039; На что меняем
p_quiet = 0
p_pause = True
p_test = False
p_sens = False
p_glob = True
p_descr = True
p_files = True
p_folders = False
p_prefix = &quot;&quot;
p_suffix = &quot;&quot;
p_move = False
p_m_c = False
p_dest = &quot;&quot;

Dim a, au, args

If WScript.Arguments.Count = 0 Then
    HELP
    WScript.Quit
End If

&#039; Разбор аргументов командной строки с именами
Set args = WScript.Arguments.Named
If args.Exists(&quot;Q&quot;) Then
    p_quiet = 2
    p_pause = False
End If
If args.Exists(&quot;Q1&quot;) Then
    &#039; Вывести только результирующую информацию
    p_quiet = 1
End If
If args.Exists(&quot;Q2&quot;) Then
    &#039; Без паузы
    p_pause = False
End If
If args.Exists(&quot;T&quot;) Then
    &#039; Тестирование (вывод результатов без реального переименования)
    p_test = True
End If
If args.Exists(&quot;CS&quot;) Then
    &#039; case sense
    p_sens = True
End If
If args.Exists(&quot;ND&quot;) Then
    p_descr = False
End If
If args.Exists(&quot;1&quot;) Then
    &#039; Только одну замену в имени
    p_glob = False
End If
If args.Exists(&quot;F&quot;) Then
    &#039; Обрабатывать только папки
    p_files = False
    p_folders = True
End If
If args.Exists(&quot;FF&quot;) Then
    &#039; Обрабатывать и файлы и папки
    p_files = True
    p_folders = True
End If
If args.Exists(&quot;P&quot;) Then
    &#039; Префикс - добавить произвольный текст в начало имени
    p_prefix = args.Item(&quot;P&quot;)
End If
If args.Exists(&quot;S&quot;) Then
    &#039; Суффикс - добавить произвольный текст в конец имени
    p_suffix = args.Item(&quot;S&quot;)
End If
If args.Exists(&quot;M&quot;) Then
    &#039; MOVE - переместить в папку
    p_move = True
    p_m_c = True
    p_dest = args.Item(&quot;M&quot;)
End If
If args.Exists(&quot;C&quot;) Then
    &#039; COPY - копировать в папку
    p_move = False
    p_m_c = True
    p_dest = args.Item(&quot;C&quot;)
End If

&#039; Разбор аргументов командной строки без имён
Set args = WScript.Arguments.Unnamed
For Each a In args
    au = UCase(Left(a,2))
    If p_xn &lt; 1 Then
        &#039; регулярное выражение
        p_find = a
        p_xn = 1
    ElseIf p_xn &lt; 2 Then
        &#039; строка замены
        If a = &quot;\&quot; Then &#039; Пустая строка
            a = &quot;&quot;
        End If
        p_with = a
        p_xn = 2
    Else
        &#039; Неправильный параметр
        HELP
        WScript.Echo &quot;ERROR: -1&quot;
        WScript.Quit -1
    End If
Next

If p_xn &lt; 1 Or Len(p_find) = 0 Then
    &#039; Недостаточно аргументов
    &#039; или пустой патерн
    HELP
    WScript.Echo &quot;ERROR: -2&quot;
    WScript.Quit -2
End If

rex.Pattern = p_find
rex.IgnoreCase = Not p_sens
rex.Global = p_glob

&#039; Проверка правильности регулярного выражения
Err.Clear
rex.Test(&quot;A&quot;)
ERRQ -4

&#039; Чтение описаний
Dim des
If p_descr Then
    Set des = New descr
    des.load
End If

&#039; Папка назначения при перемещении или копировании
Dim ddes
If p_m_c Then
    If Len(p_dest) = 0 Then
        HELP
        WScript.Quit -1
    End If
    If Right(p_dest,1)=&quot;\&quot; Then
        p_dest = Left(p_dest,Len(p_dest)-1)
    End If
    If Not p_test Then
        If Not fso.FolderExists(p_dest) Then
            Err.Clear
            fso.CreateFolder p_dest
            ERRQ -5
        End If
        Set ddes = New descr
        ddes.setpath p_dest
        ddes.load
    End If
    p_dest = p_dest &amp; &quot;\&quot;
End If

Dim f1, f2, fn1, fn2, fx, fxx

Dim ne, nf, nd, na &#039; Счётчики
Dim f, ff, fc
Dim fa()
ne = 0
nf = 0
nd = 0

If p_folders Then
    &#039; Обработка папок
    na = 0
    Set fc = fso.GetFolder(&quot;.&quot;).SubFolders
    For Each f In fc
        f1 = f.Name
        &#039;Set mat = rex.Execute(f1)
        &#039;If mat.count Then
        If rex.Test(f1) Then
            If p_xn = 1 And Not p_m_c Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    Next
    If na Then
        If Not p_m_c Then
            For Each f1 In fa
                f2 = p_prefix &amp; Trim(rex.Replace(f1,p_with)) &amp; p_suffix
                If f1 &lt;&gt; f2 Then
                    &#039; Папка требует переименования
                    If p_quiet = 0 Then
                        WScript.Echo f1
                        WScript.Echo &quot;-&gt; &quot; &amp; f2
                    End If
                    nf = nf+1
                    If Not p_test Then
                        Err.Clear
                        fso.MoveFolder f1, f2
                        &#039;Set ff = fso.GetFolder(f1) &#039; Другой способ
                        &#039;Err.Clear
                        &#039;ff.Name = f2
                        If Err.Number &lt;&gt; 0 Then
                            ne = ne+1
                            ERRW
                        ElseIf p_descr Then
                            des.move f1, f2
                        End If
                    ElseIf Len(des.getx(f1)) Then
                        nd = nd+1
                    End If
                End If
            Next
        Else &#039; move or copy
            For Each f1 In fa
                If p_quiet = 0 Then
                    WScript.Echo f1
                    &#039;WScript.Echo &quot;-&gt; &quot; &amp; p_dest
                End If
                nf = nf+1
                If Not p_test Then
                    Err.Clear
                    If p_move Then
                        fso.MoveFolder f1, p_dest
                    Else
                        fso.CopyFolder f1, p_dest
                    End If
                    If Err.Number &lt;&gt; 0 Then
                        ne = ne+1
                        ERRW
                    ElseIf p_descr Then
                        x = des.getx(f1)
                        If p_move Then
                            des.setx f1, &quot;&quot;
                        End If
                        ddes.setx f1, x
                    End If
                ElseIf Len(des.getx(f1)) Then
                    nd = nd+1
                End If
            Next
        End If
    End If
End If

If p_files Then
    &#039; Обработка файлов
    na = 0
    Set fc = fso.GetFolder(&quot;.&quot;).Files
    For Each f In fc
        f1 = f.Name
        x = InStrRev(f1,&quot;.&quot;)
        If x&gt;1 Then
            fn1 = Left(f1,x-1)
            fx = Mid(f1,x)
        Else
            fn1 = f1
            fx = &quot;&quot;
        End If
        &#039;Set mat = rex.Execute(fn1)
        &#039;If mat.count Then
        If rex.Test(fn1) Then
            If p_xn = 1 And Not p_m_c Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    Next
    If na Then
        If Not p_m_c Then
            For Each f1 In fa
                x = InStrRev(f1,&quot;.&quot;)
                If x&gt;1 Then
                    fn1 = Left(f1,x-1)
                    fx = Mid(f1,x)
                Else
                    fn1 = f1
                    fx = &quot;&quot;
                End If
                fn2 = p_prefix &amp; Trim(rex.Replace(fn1,p_with)) &amp; p_suffix
                f2 = fn2 &amp; fx
                If fn1 &lt;&gt; fn2 Then
                    &#039; Файл требует переименования
                    If p_quiet = 0 Then
                        WScript.Echo f1
                        WScript.Echo &quot;-&gt; &quot; &amp; f2
                    End If
                    nf = nf+1
                    If Not p_test Then
                        Err.Clear
                        fso.MoveFile f1, f2
                        &#039;Set ff = fso.GetFile(f1) &#039; Другой способ
                        &#039;Err.Clear
                        &#039;ff.Name = f2
                        If Err.Number &lt;&gt; 0 Then
                            ne = ne+1
                            ERRW
                        ElseIf p_descr Then
                            des.move f1, f2
                        End If
                    ElseIf Len(des.getx(f1)) Then
                        nd = nd+1
                    End If
                End If
            Next
        Else &#039; move or copy
            For Each f1 In fa
                If p_quiet = 0 Then
                    WScript.Echo f1
                    &#039;WScript.Echo &quot;-&gt; &quot; &amp; p_dest
                End If
                nf = nf+1
                If Not p_test Then
                    Err.Clear
                    If p_move Then
                        fso.MoveFile f1, p_dest
                    Else
                        fso.CopyFile f1, p_dest
                    End If
                    If Err.Number &lt;&gt; 0 Then
                        ne = ne+1
                        ERRW
                    ElseIf p_descr Then
                        x = des.getx(f1)
                        If p_move Then
                            des.setx f1, &quot;&quot;
                        End If
                        ddes.setx f1, x
                    End If
                ElseIf Len(des.getx(f1)) Then
                    nd = nd+1
                End If
            Next
        End If
    End If
End If

If p_quiet &lt; 2 Then
    WScript.Echo &quot;FOUND:  &quot; &amp; nf
    If p_xn &gt; 1 Or p_m_c Then
        &#039; Если не вывод списка, а переименование/перемещение/копирование
        WScript.Echo &quot;ERRORS: &quot; &amp; ne
    End If
End If
If p_descr Then
    If p_m_c Then
        ddes.save
    End If
    If Not p_test Then
        nd = des.dc
    End If
    des.save
    If p_quiet &lt; 2 Then
        WScript.Echo &quot;DESCR:  &quot; &amp; nd
    End If
End If
If p_pause Then
    WScript.StdOut.Write &quot;Press ENTER key to continue . . .&quot;
    x = WScript.StdIn.Read(1)
End If
WScript.Quit ne

&#039;----------------------------------------------------------------------------------------------------------
Sub HELP
    WScript.Echo &quot;Using:&quot;
    WScript.Echo &quot;  vrenn patern&quot;
    WScript.Echo &quot;  - list&quot;
    WScript.Echo &quot;or&quot;
    WScript.Echo &quot;  vrenn [options] patern replace&quot;
    WScript.Echo &quot;  - rename&quot;
    WScript.Echo &quot;or&quot;
    WScript.Echo &quot;  vrenn [options] patern [/M:folder]&quot;
    WScript.Echo &quot;  - move to folder&quot;
    WScript.Echo &quot;or&quot;
    WScript.Echo &quot;  vrenn [options] patern [/C:folder]&quot;
    WScript.Echo &quot;  - copy to folder&quot;
    WScript.Echo &quot;where:&quot;
    WScript.Echo &quot;  patern  - regular expression patern (sintax is wsh)&quot;
    WScript.Echo &quot;  replace - regular expression replace (sintax is wsh)&quot;
    WScript.Echo &quot;options:&quot;
    WScript.Echo &quot;  /Q      - quiet (no output)&quot;
    WScript.Echo &quot;  /Q1     - output only result info&quot;
    WScript.Echo &quot;  /Q2     - without pause&quot;
    WScript.Echo &quot;  /F      - rename folders only&quot;
    WScript.Echo &quot;            or&quot;
    WScript.Echo &quot;  /FF     - rename folder and files&quot;
    WScript.Echo &quot;            otherwise rename files only&quot;
    WScript.Echo &quot;  /CS     - case sensifity&quot;
    WScript.Echo &quot;  /1      - only one match (otherwise all matches)&quot;
    WScript.Echo &quot;  /P:$    - add prefix to name&quot;
    WScript.Echo &quot;  /S:$    - add suffix to name&quot;
    WScript.Echo &quot;  /ND     - not porcess descript.ion&quot;
    WScript.Echo &quot;  /T      - testing regular expression without real rename&quot;
End Sub

&#039;----------------------------------------------------------------------------------------------------------
Sub ERRQ( cod )
    If Err.Number &lt;&gt; 0 Then
        ERRW
        If cod Then
            WScript.Quit cod
        End If
    End If
End Sub
&#039;----------------------------------------------------------------------------------------------------------
Sub ERRW
    If p_quiet = 0 Then
        WScript.Echo &quot;!! ERROR: &quot; &amp; CStr(Err.Number) &amp; &quot; - &quot; &amp; Err.Description
    End If
End Sub

&#039;==========================================================================================================
&#039; Класс для работы с descript.ion
&#039; ver. 2.05
&#039;----------------------------------------------------------------------------------------------------------

Class descr
    Public da
    Public dc
    Public dfp &#039; description full path

&#039;----------------------------------------------------------------------------------------------------------

Private Sub Class_Initialize
    setpath &quot;&quot;
    ReDim da(1,0)
    da(0,0) = &quot;&quot;
    da(1,0) = &quot;&quot;
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Private Sub Class_Terminate
    da = Null
    dfp = Null
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub setpath( p )
    With CreateObject(&quot;Scripting.FileSystemObject&quot;)
        If Len(p) = 0 Then
            dfp = .GetAbsolutePathName(&quot;descript.ion&quot;)
        Else
            dfp = .GetAbsolutePathName(p &amp; &quot;\descript.ion&quot;)
        End If
    End With
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub load
    dc = 0 &#039; Счётчик изменений сразу сбрасываем, типа, изменений ещё не было
    Dim s, x, fn, ft
    Dim i : i = 0
    Dim h
    With CreateObject(&quot;Scripting.FileSystemObject&quot;)
        If Not .FileExists(dfp) Then
            Exit Sub
        End If
        Set h = .OpenTextFile(dfp,1) &#039; ForReading
        Do While Not h.AtEndOfStream
            i = i+1
            ReDim Preserve da(1,i)
            s = Trim(h.ReadLine)
            If Left(s,1) = &quot;&quot;&quot;&quot; Then
                &#039; Имя в кавычках, ищем завершающие кавычки
                x = InStr(2,s,&quot;&quot;&quot;&quot;)
                If x Then
                    fn = Mid(s,2,x-2)
                    ft = LTrim(Mid(s,x+1))
                Else
                    fn = s
                    ft = &quot;&quot;
                End If
            Else
                &#039; Имя не в кавычках, ищем пробел
                x = InStr(s,&quot; &quot;)
                If x Then
                    fn = Left(s,x-1)
                    ft = LTrim(Mid(s,x+1))
                Else
                    fn = s
                    ft = &quot;&quot;
                End If
            End If
            &#039; Если строка неправильная, ft бедет пустым
            da(0,i) = fn
            da(1,i) = ft
        Loop
        h.Close
    End With
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Function getx( f )
    Dim i
    Dim u : u = UBound(da,2)
    Dim fu : fu = UCase(f)
    If Len(f) Then
        &#039; Описания просматриваем с конца, так как действительным является последнее.
        For i=u To 0 Step -1
            If fu = UCase(da(0,i)) Then
                getx = da(1,i)
                Exit Function
            End If
        Next
    End If
    getx = &quot;&quot;
End Function

&#039;----------------------------------------------------------------------------------------------------------

Public Sub setx( f, d )
    &#039; Нужно ли удаление дубликатов?
    &#039; Нужен ли trim для описаний?
    Dim i
    Dim u : u = UBound(da,2)
    Dim fu : fu = UCase(f)
    If Len(d) Then
        &#039; Присваивание
        &#039; Описания просматриваем с конца, так как действительным является последнее.
        dc = dc+1 &#039; Изменения всегда будут
        For i=u To 0 Step -1
            If UCase(da(0,i)) = fu Then
                &#039; Меняем описание и завершаем функцию
                da(1,i) = d
                Exit Sub
            End If
        Next
        &#039; Добавляем описание
        i = u+1
        ReDim Preserve da(1,i)
        da(0,i) = f
        da(1,i) = d
    Else
        &#039; Удаление
        For i=u To 0 Step -1
            If UCase(da(0,i)) = fu Then
                &#039; Удаляем имя и описание и завершаем функцию
                da(0,i) = &quot;&quot;
                da(1,i) = &quot;&quot;
                dc = dc+1
                Exit Sub
            End If
        Next
    End If
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub move( f1, f2 )
    Dim i
    Dim fud
    Dim fu1 : fu1 = UCase(f1)
    Dim fu2 : fu2 = UCase(f2)
    Dim fnd : fnd = False
    Dim u : u = UBound(da,2)
    If Len(f2) Then
        &#039; Переименование
        &#039; Описания просматриваем с конца, так как действительным является последнее.
        &#039; Если будут дубляжи f1 - пропускаем.
        &#039; Если будут дубляжи f2 - удаляем.
        For i=u To 0 Step -1
            fud = UCase(da(0,i))
            If fud = fu1 Then
                &#039; Меняем имя файла
                &#039; Но только один раз
                If Not fnd Then
                    da(0,i) = f2
                    dc = dc+1
                    fnd = True
                End If
            ElseIf fud = fu2 Then
                &#039; Удаляем имя и описание
                &#039; Но только если переименование уже было
                If fnd Then
                    da(0,i) = &quot;&quot;
                    da(1,i) = &quot;&quot;
                End If
            End If
        Next
    Else
        &#039; Удаление
        For i=0 To u
            fud = UCase(da(0,i))
            If fud = fu1 Then
                &#039; Удаляем имя и описание
                da(0,i) = &quot;&quot;
                da(1,i) = &quot;&quot;
                dc = dc+1
            End If
        Next
    End If
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub save
    If dc = 0 Then
        &#039; Если не было изменений нефиг и записывать
        Exit Sub
    End If
    Dim u : u = UBound(da,2)
    Dim i, s, d0, d1
    Dim n : n = 0 &#039; Счётчик записанных строк
    Dim h
    With CreateObject(&quot;Scripting.FileSystemObject&quot;)
        Set h = .OpenTextFile(dfp,2,Not .FileExists(dfp)) &#039; ForWriting
        For i=0 To u
            d0 = da(0,i)
            d1 = da(1,i)
            If Len(d0) Then
                &#039; Не пустое имя файла
                If Len(d1) Then
                    &#039; Это была правильная строка
                    If InStr(d0,&quot; &quot;) Then
                        s = &quot;&quot;&quot;&quot; &amp; d0 &amp; &quot;&quot;&quot; &quot; &amp; d1
                    Else
                        s = d0 &amp; &quot; &quot; &amp; d1
                    End If
                Else
                    &#039; Это была неправильная строка
                    s = d0
                End If
                h.WriteLine( s )
                n = n+1
            End If
        Next
        dc = 0 &#039; Изменений больше нет
        h.Close
        If n = 0 Then
            &#039; Файл пустой
            .DeleteFile dfp, True
        Else
            Set h = .GetFile(dfp)
            h.Attributes = 34
        End If
    End With
End Sub

&#039;----------------------------------------------------------------------------------------------------------

End Class

&#039;==========================================================================================================</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Smitis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5649</uri>
			</author>
			<updated>2011-07-31T14:19:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=50301#p50301</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Переименование файлов с использованием регулярных выражений]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=49549#p49549" />
			<content type="html"><![CDATA[<p>Версия с дополнительной фильтрацией по маске файлов/папок.<br />Фильтр имеет обычный вид ДОС маски с использованием метасимволов * и ?<br />Фильтр обязателен и задаётся первым &quot;безымянным&quot; параметром.<br />Возможно задание нескольких масок через точку с запятой (*.jpg;*.gif;*.png)<br />В принципе, метасимволы не обязательны, тогда подразумеваются конкретные имена файлов/папок.</p><p>vrenm.vbs<br /></p><div class="codebox"><pre><code>&#039; Переименование файлов с использование регулярных выражений
&#039; Расширения файлов не изменяются!
&#039; Для папок, в отличии от файлов, расширения не имеют для системы значения, поэтому их имена обрабатываются целиком.

&#039; На основе vrenn.vbs (нумерация версий та же)
&#039; Отличия - первый параметр - маска файлов

&#039; v.3.00

Option Explicit
On Error Resume Next

Dim x

Dim fso, shl, rex, mat, shap
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set shl = CreateObject(&quot;WScript.Shell&quot;)
Set rex = New RegExp
Set shap = CreateObject(&quot;Shell.Application&quot;)

&#039; Аргументы
Dim p_xn, p_mask, p_find, p_with
Dim p_quiet, p_sens, p_eni, p_glob, p_descr
Dim p_files, p_folders
p_xn = 0
p_mask = &quot;&quot;
p_find = &quot;&quot; &#039; Что ищем
p_with = &quot;&quot; &#039; На что меняем
p_quiet = 0
p_sens = False
p_eni = False
p_glob = True
p_descr = True
p_files = True
p_folders = False

Dim a, au, args

&#039; Разбор аргументов командной строки с именами
Set args = WScript.Arguments.Named
If args.Exists(&quot;Q&quot;) Then
    p_quiet = 2
End If
If args.Exists(&quot;Q1&quot;) Then
    &#039; Вывести только результирующую информацию
    p_quiet = 1
End If
If args.Exists(&quot;S&quot;) Then
    p_sens = True
End If
If args.Exists(&quot;ND&quot;) Then
    p_descr = False
End If
If args.Exists(&quot;1&quot;) Then
    &#039; Только одну замену в имени
    p_glob = False
End If
If args.Exists(&quot;F&quot;) Then
    &#039; Обрабатывать только папки
    p_files = False
    p_folders = True
End If
If args.Exists(&quot;FF&quot;) Then
    &#039; Обрабатывать и файлы и папки
    p_files = True
    p_folders = True
End If

&#039; Разбор аргументов командной строки без имён
Set args = WScript.Arguments.Unnamed
For Each a In args
    au = UCase(Left(a,2))
    If a = &quot;\&quot; Then
        &#039; Пустая строка
        a = &quot;&quot;
    End If
    If p_xn &lt; 1 Then
        p_mask = a
        p_xn = 1
    ElseIf p_xn &lt; 2 Then
        p_find = a
        p_xn = 2
    ElseIf p_xn &lt; 3 Then
        p_with = a
        p_xn = 3
    Else
        &#039; Неправильный параметр
        help
        WScript.Quit
    End If
Next

If InStr(p_mask,&quot;*&quot;)=0 And InStr(p_mask,&quot;?&quot;)=0 Then
    &#039; Пустая маска
    help
    WScript.Quit -3
End If
If p_xn &lt; 2 Or p_find = &quot;&quot; Then
    &#039; Недостаточно аргументов
    &#039; или пустой патерн
    help
    WScript.Quit -1
End If

rex.Pattern = p_find
rex.IgnoreCase = Not p_sens
rex.Global = p_glob

&#039; Проверка правильности регулярного выражения
Err.Clear
rex.Test(&quot;A&quot;)
If Err.Number Then
    WScript.Echo &quot;ERROR # &quot; &amp; CStr(Err.Number) &amp; &quot; &quot; &amp; Err.Description
    WScript.Quit -2
End If

&#039; Чтение описаний
Dim des
If p_descr Then
    Set des = New descr
    des.load
End If

Dim f1, f2, fn1, fn2, fx, fxx

Dim ne, nf, nd, na &#039; Счётчики
Dim f, ff, fc
Dim fa()
ne = 0
nf = 0
nd = 0

If p_folders Then
    &#039; Обработка папок
    na = 0
    Set fc = shap.NameSpace(shl.CurrentDirectory).Items()
    fc.Filter 32, p_mask
    For Each f In fc
        f1 = f
        If rex.Test(f1) Then
            If p_xn = 2 Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    Next
    If na Then
        For Each f1 In fa
            f2 = rex.Replace(f1,p_with)
            If f1 &lt;&gt; f2 Then
                &#039; Папка требует переименования
                If p_quiet = 0 Then
                    WScript.Echo f1
                    WScript.Echo &quot;-&gt; &quot; &amp; f2
                End If
                nf = nf+1
                Err.Clear
                fso.MoveFolder f1, f2
                &#039;Set ff = fso.GetFolder(f1) &#039; Другой способ
                &#039;Err.Clear
                &#039;ff.Name = f2
                If Err.Number &lt;&gt; 0 Then
                    ne = ne+1
                    If p_quiet = 0 Then
                        WScript.Echo &quot;!! ERROR: &quot; &amp; CStr(Err.Number) &amp; &quot; - &quot; &amp; Err.Description
                    End If
                ElseIf p_descr Then
                    des.move f1, f2
                End If
            End If
        Next
    End If
End If

If p_files Then
    &#039; Обработка файлов
    na = 0
    Set fc = shap.NameSpace(shl.CurrentDirectory).Items()
    fc.Filter 64, p_mask
    For Each f In fc
        f1 = f
        x = InStrRev(f1,&quot;.&quot;)
        If x&gt;1 Then
            fn1 = Left(f1,x-1)
            fx = Mid(f1,x)
        Else
            fn1 = f1
            fx = &quot;&quot;
        End If
        If rex.Test(fn1) Then
            If p_xn = 2 Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    Next
    If na Then
        For Each f1 In fa
            x = InStrRev(f1,&quot;.&quot;)
            If x&gt;1 Then
                fn1 = Left(f1,x-1)
                fx = Mid(f1,x)
                fxx = UCase(Mid(f1,x+1))
            Else
                fn1 = f1
                fx = &quot;&quot;
                fxx = &quot;&quot;
            End If
            fn2 = rex.Replace(fn1,p_with)
            f2 = fn2 &amp; fx
            If fn1 &lt;&gt; fn2 Then
                &#039; Файл требует переименования
                If p_quiet = 0 Then
                    WScript.Echo f1
                    WScript.Echo &quot;-&gt; &quot; &amp; f2
                End If
                nf = nf+1
                Err.Clear
                fso.MoveFile f1, f2
                &#039;Set ff = fso.GetFile(f1) &#039; Другой способ
                &#039;Err.Clear
                &#039;ff.Name = f2
                If Err.Number &lt;&gt; 0 Then
                    ne = ne+1
                    If p_quiet = 0 Then
                        WScript.Echo &quot;!! ERROR: &quot; &amp; CStr(Err.Number) &amp; &quot; - &quot; &amp; Err.Description
                    End If
                ElseIf p_descr Then
                    des.move f1, f2
                End If
            End If
        Next
    End If
End If

If p_quiet &lt; 2 Then
    WScript.Echo &quot;FOUND:  &quot; &amp; nf
    If p_xn &gt; 2 Then
        &#039; Если не вывод списка, а переименование
        WScript.Echo &quot;ERRORS: &quot; &amp; ne
    End If
End If

If p_descr Then
    nd = des.dc
    des.save
    If p_quiet &lt; 2 Then
        WScript.Echo &quot;DESCR:  &quot; &amp; nd
    End If
End If

WScript.Quit ne

&#039;----------------------------------------------------------------------------------------------------------
Sub Help
    WScript.Echo &quot;Using:&quot;
    WScript.Echo &quot;  vrenm mask patern&quot;
    WScript.Echo &quot;  - list&quot;
    WScript.Echo &quot;or&quot;
    WScript.Echo &quot;  vrenm [options] mask patern replace&quot;
    WScript.Echo &quot;  - rename&quot;
    WScript.Echo &quot;where:&quot;
    WScript.Echo &quot;  mask    - file masks separated by &#039;;&#039; character&quot;
    WScript.Echo &quot;            samples:&quot;
    WScript.Echo &quot;              *.jpg&quot;
    WScript.Echo &quot;              *.doc;*.docx;readme.*&quot;
    WScript.Echo &quot;  patern  - regular expression patern (sintax is wsh)&quot;
    WScript.Echo &quot;  replace - regular expression replace (sintax is wsh)&quot;
    WScript.Echo &quot;options:&quot;
    WScript.Echo &quot;  /q      - quiet (no output)&quot;
    WScript.Echo &quot;  /q1     - output only result info&quot;
    WScript.Echo &quot;  /f      - rename folders only&quot;
    WScript.Echo &quot;            or&quot;
    WScript.Echo &quot;  /ff     - rename folder and files&quot;
    WScript.Echo &quot;            otherwise rename files only&quot;
    WScript.Echo &quot;  /s      - case sensifity&quot;
    WScript.Echo &quot;  /1      - only one match (otherwise all matches)&quot;
    WScript.Echo &quot;  /nd     - not porcess descript.ion&quot;
    &#039;WScript.Echo &quot;  /eni    - not ighore file extensions&quot;
End Sub

&#039;==========================================================================================================
&#039; Класс для работы с descript.ion
&#039; ver. 2.01
&#039;----------------------------------------------------------------------------------------------------------

Class descr
    Public da
    Public dc
    Public fso

&#039;----------------------------------------------------------------------------------------------------------

Private Sub Class_Initialize
    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    &#039; Загрузка из файла при создании
    &#039;da.load
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Private Sub Class_Terminate
    Set fso = Nothing
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub load
    dc = 0 &#039; Счётчик изменений сразу сбрасываем, типа, изменений ещё не было
    Dim i, u, s, x, fn
    Dim dx      &#039; промежуточный массив
    Dim dt      &#039; текст с описаниями
    Dim ft
    Set ft = fso.OpenTextFile(&quot;descript.ion&quot;,1) &#039; ForReading
    dt = ft.ReadAll
    dx = Split(dt,vbCrLf)
    dt = Null
    u = UBound(dx)
    ReDim da(1,u)
    For i=0 To u
        s = Trim(dx(i))
        If Left(s,1) = &quot;&quot;&quot;&quot; Then
            &#039; Имя в кавычках, ищем завершающие кавычки
            x = InStr(2,s,&quot;&quot;&quot;&quot;)
            If x Then
                fn = Mid(s,2,x-2)
                ft = LTrim(Mid(s,x+1))
            Else
                fn = s
                ft = &quot;&quot;
            End If
        Else
            &#039; Имя не в кавычках, ищем пробел
            x = InStr(s,&quot; &quot;)
            If x Then
                fn = Left(s,x-1)
                ft = LTrim(Mid(s,x+1))
            Else
                fn = s
                ft = &quot;&quot;
            End If
        End If
        &#039; Если строка неправильная, ft бедет пустым
        da(0,i) = fn
        da(1,i) = ft
    Next
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub move( f1, f2 )
    Dim i, u : u = UBound(da,2)
    Dim fud
    Dim fu1 : fu1 = UCase(f1)
    Dim fu2 : fu2 = UCase(f2)
    Dim fnd : fnd = False

    If Len(f2) Then
        &#039; Переименование

        &#039; Описания просматриваем с конца, так как действительным является последнее.
        &#039; Если будут дубляжи f1 - пропускаем.
        &#039; Если будут дубляжи f2 - удаляем.

        For i=u To 0 Step -1
            fud = UCase(da(0,i))
            If fud = fu1 Then
                &#039; Меняем имя файла
                &#039; Но только один раз
                If Not fnd Then
                    da(0,i) = f2
                    dc = dc+1
                    fnd = True
                End If
            ElseIf fud = fu2 Then
                &#039; Удаляем имя и описание
                &#039; Но только если переименование уже было
                If fnd Then
                    da(0,i) = &quot;&quot;
                    da(1,i) = &quot;&quot;
                End If
            End If
        Next
    Else
        &#039; Удаление
        For i=0 To u
            fud = UCase(da(0,i))
            If fud = fu1 Then
                &#039; Удаляем имя и описание
                da(0,i) = &quot;&quot;
                da(1,i) = &quot;&quot;
                dc = dc+1
            End If
        Next
    End If
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub save
    If dc = 0 Then
        &#039; Если не было изменений нефиг и записывать
        Exit Sub
    End If
    Dim ft 
    Set ft = fso.OpenTextFile(&quot;descript.ion&quot;,2) &#039; ForWriting
    Dim i, u, s, d0, d1
    u = UBound(da,2)
    For i=0 To u
        d0 = da(0,i)
        d1 = da(1,i)
        If Len(d0) Then
            &#039; Не пустое имя файла
            If Len(d1) Then
                &#039; Это была правильная строка
                If InStr(d0,&quot; &quot;) Then
                    s = &quot;&quot;&quot;&quot; &amp; d0 &amp; &quot;&quot;&quot; &quot; &amp; d1
                Else
                    s = d0 &amp; &quot; &quot; &amp; d1
                End If
            Else
                &#039; Это была неправильная строка
                s = d0
            End If
            ft.WriteLine( s )
        End If
    Next
    dc = 0 &#039; Изменений больше нет
End Sub

&#039;----------------------------------------------------------------------------------------------------------

End Class

&#039;==========================================================================================================</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Smitis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5649</uri>
			</author>
			<updated>2011-06-30T07:59:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=49549#p49549</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Переименование файлов с использованием регулярных выражений]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=49548#p49548" />
			<content type="html"><![CDATA[<p>Новая версия</p><p>Изменения:<br />- Исключён ключ /X (выбор расширений) за ненадобностью (теперь это делает другой скрипт по маске, к тому же он из-за неточности был регистрозависимым).<br />- Вместо пустой строки для замены можно ввести один символ \ (быстрее набирать <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> ).<br />- Добавлено переименование только папок (ключ /F) или папок и файлов (ключ /FF)(по умолчанию переименовываются только файлы).<br />- Обработка описаний из файла descript.ion (в кодировке CP-1251).</p><p>vrenn.vbs<br /></p><div class="codebox"><pre><code>&#039; Переименование файлов с использование регулярных выражений
&#039; Расширения файлов не изменяются!
&#039; Для папок, в отличии от файлов, расширения не имеют для системы значения, поэтому их имена обрабатываются целиком.

&#039; v.3.00

Option Explicit
On Error Resume Next

Dim x

Dim fso, shl, rex, mat
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set shl = CreateObject(&quot;WScript.Shell&quot;)
Set rex = New RegExp

&#039; Аргументы
Dim p_xn, p_find, p_with
Dim p_quiet, p_sens, p_eni, p_glob, p_descr
Dim p_files, p_folders
p_xn = 0
p_find = &quot;&quot; &#039; Что ищем
p_with = &quot;&quot; &#039; На что меняем
p_quiet = 0
p_sens = False
p_eni = False
p_glob = True
p_descr = True
p_files = True
p_folders = False

Dim a, au, args

&#039; Разбор аргументов командной строки с именами
Set args = WScript.Arguments.Named
If args.Exists(&quot;Q&quot;) Then
    p_quiet = 2
End If
If args.Exists(&quot;Q1&quot;) Then
    &#039; Вывести только результирующую информацию
    p_quiet = 1
End If
If args.Exists(&quot;S&quot;) Then
    p_sens = True
End If
If args.Exists(&quot;ND&quot;) Then
    p_descr = False
End If
If args.Exists(&quot;1&quot;) Then
    &#039; Только одну замену в имени
    p_glob = False
End If
If args.Exists(&quot;F&quot;) Then
    &#039; Обрабатывать только папки
    p_files = False
    p_folders = True
End If
If args.Exists(&quot;FF&quot;) Then
    &#039; Обрабатывать и файлы и папки
    p_files = True
    p_folders = True
End If

&#039; Разбор аргументов командной строки без имён
Set args = WScript.Arguments.Unnamed
For Each a In args
    au = UCase(Left(a,2))
    If a = &quot;\&quot; Then
        &#039; Пустая строка
        a = &quot;&quot;
    End If
    If p_xn &lt; 1 Then
        p_find = a
        p_xn = 1
    ElseIf p_xn &lt; 2 Then
        p_with = a
        p_xn = 2
    Else
        &#039; Неправильный параметр
        help
        WScript.Quit
    End If
Next

If p_xn &lt; 1 Or p_find = &quot;&quot; Then
    &#039; Недостаточно аргументов
    &#039; или пустой патерн
    help
    WScript.Quit -1
End If

rex.Pattern = p_find
rex.IgnoreCase = Not p_sens
rex.Global = p_glob

&#039; Проверка правильности регулярного выражения
Err.Clear
rex.Test(&quot;A&quot;)
If Err.Number Then
    WScript.Echo &quot;ERROR # &quot; &amp; CStr(Err.Number) &amp; &quot; &quot; &amp; Err.Description
    WScript.Quit -2
End If

&#039; Чтение описаний
Dim des
If p_descr Then
    Set des = New descr
    des.load
End If

Dim f1, f2, fn1, fn2, fx, fxx

Dim ne, nf, nd, na &#039; Счётчики
Dim f, ff, fc
Dim fa()
ne = 0
nf = 0
nd = 0

If p_folders Then
    &#039; Обработка папок
    na = 0
    Set fc = fso.GetFolder(&quot;.&quot;).SubFolders
    For Each f In fc
        f1 = f.Name
        If rex.Test(f1) Then
            If p_xn = 1 Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    Next
    If na Then
        For Each f1 In fa
            f2 = rex.Replace(f1,p_with)
            If f1 &lt;&gt; f2 Then
                &#039; Папка требует переименования
                If p_quiet = 0 Then
                    WScript.Echo f1
                    WScript.Echo &quot;-&gt; &quot; &amp; f2
                End If
                nf = nf+1
                Err.Clear
                fso.MoveFolder f1, f2
                &#039;Set ff = fso.GetFolder(f1) &#039; Другой способ
                &#039;Err.Clear
                &#039;ff.Name = f2
                If Err.Number &lt;&gt; 0 Then
                    ne = ne+1
                    If p_quiet = 0 Then
                        WScript.Echo &quot;!! ERROR: &quot; &amp; CStr(Err.Number) &amp; &quot; - &quot; &amp; Err.Description
                    End If
                ElseIf p_descr Then
                    des.move f1, f2
                End If
            End If
        Next
    End If
End If

If p_files Then
    &#039; Обработка файлов
    na = 0
    Set fc = fso.GetFolder(&quot;.&quot;).Files
    For Each f In fc
        f1 = f.Name
        x = InStrRev(f1,&quot;.&quot;)
        If x&gt;1 Then
            fn1 = Left(f1,x-1)
            fx = Mid(f1,x)
        Else
            fn1 = f1
            fx = &quot;&quot;
        End If
        If rex.Test(fn1) Then
            If p_xn = 1 Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    Next
    If na Then
        For Each f1 In fa
            x = InStrRev(f1,&quot;.&quot;)
            If x&gt;1 Then
                fn1 = Left(f1,x-1)
                fx = Mid(f1,x)
            Else
                fn1 = f1
                fx = &quot;&quot;
            End If
            fn2 = rex.Replace(fn1,p_with)
            f2 = fn2 &amp; fx
            If fn1 &lt;&gt; fn2 Then
                &#039; Файл требует переименования
                If p_quiet = 0 Then
                    WScript.Echo f1
                    WScript.Echo &quot;-&gt; &quot; &amp; f2
                End If
                nf = nf+1
                Err.Clear
                fso.MoveFile f1, f2
                &#039;Set ff = fso.GetFile(f1) &#039; Другой способ
                &#039;Err.Clear
                &#039;ff.Name = f2
                If Err.Number &lt;&gt; 0 Then
                    ne = ne+1
                    If p_quiet = 0 Then
                        WScript.Echo &quot;!! ERROR: &quot; &amp; CStr(Err.Number) &amp; &quot; - &quot; &amp; Err.Description
                    End If
                ElseIf p_descr Then
                    des.move f1, f2
                End If
            End If
        Next
    End If
End If

If p_quiet &lt; 2 Then
    WScript.Echo &quot;FOUND:  &quot; &amp; nf
    If p_xn &gt; 1 Then
        &#039; Если не вывод списка, а переименование
        WScript.Echo &quot;ERRORS: &quot; &amp; ne
    End If
End If

If p_descr Then
    nd = des.dc
    des.save
    If p_quiet &lt; 2 Then
        WScript.Echo &quot;DESCR:  &quot; &amp; nd
    End If
End If

WScript.Quit ne

&#039;----------------------------------------------------------------------------------------------------------
Sub Help
    WScript.Echo &quot;Using:&quot;
    WScript.Echo &quot;  vrenn patern&quot;
    WScript.Echo &quot;  - list&quot;
    WScript.Echo &quot;or&quot;
    WScript.Echo &quot;  vrenn [options] patern replace&quot;
    WScript.Echo &quot;  - rename&quot;
    WScript.Echo &quot;where:&quot;
    WScript.Echo &quot;  patern  - regular expression patern (sintax is wsh)&quot;
    WScript.Echo &quot;  replace - regular expression replace (sintax is wsh)&quot;
    WScript.Echo &quot;options:&quot;
    WScript.Echo &quot;  /q      - quiet (no output)&quot;
    WScript.Echo &quot;  /q1     - output only result info&quot;
    WScript.Echo &quot;  /f      - rename folders only&quot;
    WScript.Echo &quot;            or&quot;
    WScript.Echo &quot;  /ff     - rename folder and files&quot;
    WScript.Echo &quot;            otherwise rename files only&quot;
    WScript.Echo &quot;  /s      - case sensifity&quot;
    WScript.Echo &quot;  /1      - only one match (otherwise all matches)&quot;
    WScript.Echo &quot;  /nd     - not porcess descript.ion&quot;
    &#039;WScript.Echo &quot;  /eni    - not ighore file extensions&quot;
End Sub

&#039;==========================================================================================================
&#039; Класс для работы с descript.ion
&#039; ver. 2.01
&#039;----------------------------------------------------------------------------------------------------------

Class descr
    Public da
    Public dc
    Public fso

&#039;----------------------------------------------------------------------------------------------------------

Private Sub Class_Initialize
    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    &#039; Загрузка из файла при создании
    &#039;da.load
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Private Sub Class_Terminate
    Set fso = Nothing
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub load
    dc = 0 &#039; Счётчик изменений сразу сбрасываем, типа, изменений ещё не было
    Dim i, u, s, x, fn
    Dim dx      &#039; промежуточный массив
    Dim dt      &#039; текст с описаниями
    Dim ft
    Set ft = fso.OpenTextFile(&quot;descript.ion&quot;,1) &#039; ForReading
    dt = ft.ReadAll
    dx = Split(dt,vbCrLf)
    dt = Null
    u = UBound(dx)
    ReDim da(1,u)
    For i=0 To u
        s = Trim(dx(i))
        If Left(s,1) = &quot;&quot;&quot;&quot; Then
            &#039; Имя в кавычках, ищем завершающие кавычки
            x = InStr(2,s,&quot;&quot;&quot;&quot;)
            If x Then
                fn = Mid(s,2,x-2)
                ft = LTrim(Mid(s,x+1))
            Else
                fn = s
                ft = &quot;&quot;
            End If
        Else
            &#039; Имя не в кавычках, ищем пробел
            x = InStr(s,&quot; &quot;)
            If x Then
                fn = Left(s,x-1)
                ft = LTrim(Mid(s,x+1))
            Else
                fn = s
                ft = &quot;&quot;
            End If
        End If
        &#039; Если строка неправильная, ft бедет пустым
        da(0,i) = fn
        da(1,i) = ft
    Next
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub move( f1, f2 )
    Dim i, u : u = UBound(da,2)
    Dim fud
    Dim fu1 : fu1 = UCase(f1)
    Dim fu2 : fu2 = UCase(f2)
    Dim fnd : fnd = False

    If Len(f2) Then
        &#039; Переименование

        &#039; Описания просматриваем с конца, так как действительным является последнее.
        &#039; Если будут дубляжи f1 - пропускаем.
        &#039; Если будут дубляжи f2 - удаляем.

        For i=u To 0 Step -1
            fud = UCase(da(0,i))
            If fud = fu1 Then
                &#039; Меняем имя файла
                &#039; Но только один раз
                If Not fnd Then
                    da(0,i) = f2
                    dc = dc+1
                    fnd = True
                End If
            ElseIf fud = fu2 Then
                &#039; Удаляем имя и описание
                &#039; Но только если переименование уже было
                If fnd Then
                    da(0,i) = &quot;&quot;
                    da(1,i) = &quot;&quot;
                End If
            End If
        Next
    Else
        &#039; Удаление
        For i=0 To u
            fud = UCase(da(0,i))
            If fud = fu1 Then
                &#039; Удаляем имя и описание
                da(0,i) = &quot;&quot;
                da(1,i) = &quot;&quot;
                dc = dc+1
            End If
        Next
    End If
End Sub

&#039;----------------------------------------------------------------------------------------------------------

Public Sub save
    If dc = 0 Then
        &#039; Если не было изменений нефиг и записывать
        Exit Sub
    End If
    Dim ft
    Set ft = fso.OpenTextFile(&quot;descript.ion&quot;,2) &#039; ForWriting
    Dim i, u, s, d0, d1
    u = UBound(da,2)
    For i=0 To u
        d0 = da(0,i)
        d1 = da(1,i)
        If Len(d0) Then
            &#039; Не пустое имя файла
            If Len(d1) Then
                &#039; Это была правильная строка
                If InStr(d0,&quot; &quot;) Then
                    s = &quot;&quot;&quot;&quot; &amp; d0 &amp; &quot;&quot;&quot; &quot; &amp; d1
                Else
                    s = d0 &amp; &quot; &quot; &amp; d1
                End If
            Else
                &#039; Это была неправильная строка
                s = d0
            End If
            ft.WriteLine( s )
        End If
    Next
    dc = 0 &#039; Изменений больше нет
End Sub

&#039;----------------------------------------------------------------------------------------------------------

End Class

&#039;==========================================================================================================</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Smitis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5649</uri>
			</author>
			<updated>2011-06-30T07:57:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=49548#p49548</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Переименование файлов с использованием регулярных выражений]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=48077#p48077" />
			<content type="html"><![CDATA[<p>Выяснился неприятный момент. Переименованный файл может снова оказаться в коллекции и быть повторно обработан. Альтернативный метод переименования изменением свойства Name файла даёт аналогичный результат. Иногда это случается, иногда - нет.<br />Новая версия сначала создаёт в массиве список файлов, подлежащих переименовании. Не знаю, как это скажется на производительности при большом количестве файлов.</p>]]></content>
			<author>
				<name><![CDATA[Smitis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5649</uri>
			</author>
			<updated>2011-05-03T18:23:18Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=48077#p48077</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript: Переименование файлов с использованием регулярных выражений]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=43389#p43389" />
			<content type="html"><![CDATA[<p>Переименование файлов с использованием регулярных выражений из командной строки или других скриптов.<br />Для запуска использовать cscript.<br />- Формат регулярных выражений VBS.<br />- Папки не обрабатываются, только файлы.<br />- Обрабатываются только имена файлов, расширения игнорируются (т.е. не обрабатываются и остаются прежними).<br />- Файлы обрабатываются только в текущей папке, без обхода подпапок.<br />- Код возврата - количество переименованных файлов (0 - переименований не было) или -1 (2147483647) в случае ошибки в параметрах.</p><p>Скрипт vrenn.vbs<br /></p><div class="codebox"><pre><code>&#039; Переименование файлов с использование регулярных выражений
&#039; Расширения файлов не изменяются!
&#039; v.2.00.sc (for ScriptCoding)

Option Explicit
On Error Resume Next

Dim x
Dim fso, shl, rex, mat
Dim a, au, args

Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set shl = CreateObject(&quot;WScript.Shell&quot;)
Set rex = New RegExp

&#039; Разбор аргументов
Dim p_x1, p_x2, p_xn, p_quiet, p_sens, p_exts, p_glob, p_list
Dim q_exts
p_xn = 0
p_quiet = 0
p_sens = False
p_glob = True

&#039; Разбор аргументов командной строки с именами
Set args = WScript.Arguments.Named
If args.Exists(&quot;Q&quot;) Then
    p_quiet = 2
End If
If args.Exists(&quot;Q1&quot;) Then
    &#039; Вывести только результирующую информацию
    p_quiet = 1
End If
If args.Exists(&quot;S&quot;) Then
    p_sens = True
End If
If args.Exists(&quot;X&quot;) Then
    &#039; Если список расширений пуст,
    &#039; будут использоваться любые расширения
    p_exts = args.Item(&quot;X&quot;)
End If
If args.Exists(&quot;1&quot;) Then
    &#039; Только одну замену в имени
    p_glob = False
End If

&#039; Разбор аргументов командной строки без имён
Set args = WScript.Arguments.Unnamed
For Each a In args
    au = UCase(Left(a,2))
    If p_xn &lt; 1 Then
        p_x1 = a
        p_xn = 1
    ElseIf p_xn &lt; 2 Then
        p_x2 = a
        p_xn = 2
    ElseIf p_xn &lt; 3 Then
        p_exts = a
        p_xn = 3
    Else
        &#039; Неправильный параметр
        vrenn_help
        WScript.Quit
    End If
Next

If p_xn &lt; 1 Or p_x1 = &quot;&quot; Then
    &#039; Недостаточно аргументов
    &#039; или пустой патерн
    vrenn_help
    WScript.Quit
End If

q_exts = Len(p_exts)&gt;0 &#039; Заданы ли расширения

rex.Pattern = p_x1
rex.IgnoreCase = Not p_sens
rex.Global = p_glob

&#039; Проверка правильности регулярного выражения
Err.Clear
rex.Test(&quot;A&quot;)
If Err.Number Then
    WScript.Echo &quot;ERROR # &quot; &amp; CStr(Err.Number) &amp; &quot; &quot; &amp; Err.Description
    WScript.Quit 2147483647 &#039; &amp;H7FFFFFFF
End If

Dim f1, f2, fn1, fn2, fx

Dim ne, nf, na &#039; Счётчики
Dim f, fc, fa()
ne = 0
nf = 0
na = 0
Set fc = fso.GetFolder(&quot;.&quot;).Files

For Each f In fc
    f1 = f.Name
    x = InStrRev(f1,&quot;.&quot;)
    If x&gt;1 Then
        fn1 = Left(f1,x-1)
        fx = Mid(f1,x)
    Else
        fn1 = f1
        fx = &quot;&quot;
    End If
    &#039; Проверяем расширение файла
    If Not q_exts Or (q_exts And fx&lt;&gt;&quot;&quot; And InStr(p_exts,fx)&gt;0) Then
        Set mat = rex.Execute(fn1)
        If mat.count Then
            If p_xn = 1 Then
                &#039; Вывод списка
                WScript.Echo f1
                nf = nf+1
            Else
                &#039; В массив для переименования
                ReDim Preserve fa(na)
                fa(na) = f1
                na = na+1
            End If
        End If
    End If
Next

If na Then
    &#039; Переименование
    For Each f1 In fa
        x = InStrRev(f1,&quot;.&quot;)
        If x&gt;1 Then
            fn1 = Left(f1,x-1)
            fx = Mid(f1,x)
        Else
            fn1 = f1
            fx = &quot;&quot;
        End If
        fn2 = rex.Replace(fn1,p_x2)
        f2 = fn2 &amp; fx
        If fn1 &lt;&gt; fn2 Then
            &#039; Файл требует переименования
            If Not p_quiet Then
                WScript.Echo f1
                WScript.Echo &quot;-&gt; &quot; &amp; f2
            End If
            nf = nf+1
            Err.Clear
            fso.MoveFile f1, f2
            If Err.Number &lt;&gt; 0 Then
                ne = ne+1
            End If
        End If
    Next
End If

If p_quiet &lt; 2 Then
    WScript.Echo &quot;FOUND:  &quot; &amp; nf
    If p_xn &gt; 1 Then
        WScript.Echo &quot;ERRORS: &quot; &amp; ne
    End If
End If

WScript.Quit ne

Sub vrenn_help()

    WScript.Echo &quot;Using:&quot;
    WScript.Echo &quot;    vrenn [/X:exts|/X|/XX] [/S] patern [exts]&quot;
    WScript.Echo &quot;        or&quot;
    WScript.Echo &quot;    vrenn [/Qjhnmk] [/X:exts|/X|/XX] patern replace [exts]&quot;
    WScript.Echo &quot;        where:&quot;
    WScript.Echo &quot;    /X:exts - extensions separated by &#039;;&#039; character&quot;
    WScript.Echo &quot;    /X      - all extensions&quot;
    WScript.Echo &quot;    /1      - only one match in one name (otherwise all matches)&quot;
    WScript.Echo &quot;    /S      - case sensitive&quot;
    WScript.Echo &quot;    /Q      - quiet&quot;
    WScript.Echo &quot;    /Q1     - quiet (output result only)&quot;
    WScript.Echo &quot;&quot;

End Sub</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Smitis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5649</uri>
			</author>
			<updated>2011-01-07T21:38:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=43389#p43389</id>
		</entry>
</feed>
