1 (изменено: alexii, 2014-07-09 13:31:27)

Тема: VBS: Переименование папок по маске

Здравствуйте, помогите пожалуйста решить задачу, есть несколько папок с именами 111, 222, 333, 444 их нужно переименовать, например, в папка1, папка2, папка3, папка4 но каждое новое имя должно соответствовать определенному старому имени, т.е. папка с именем "111" должна всегда переименовываться в "папка1", "222" в "папка2" и т.д Нужно как то задать соответствие старых и новых имен, а как это сделать ума не приложу. Сразу скажу, что познания в написании скриптов у меня небольшие, пока что смог написать только это:

set FSO = CreateObject("Scripting.FileSystemObject")
look = "d:\2\look\"
out = "d:\2\out\"                     
set lookDir = FSO.GetFolder(look)
set outDir = FSO.GetFolder(out)
    for each subFolder in lookDir.subFolders
        NewName = FSO.GetBaseName(subFolder.Name)
        msgbox NewName
    next
set FSO = Nothing

знаю что это ниочем, так что сильно не ругайте.

2

Re: VBS: Переименование папок по маске

Нужно как то задать соответствие старых и новых имен

Перечень соответствия известен? Используйте словарь. Если нет — то опишите принципы, по которым будет строиться соответствие.

3 (изменено: Djdfy, 2014-07-09 13:50:37)

Re: VBS: Переименование папок по маске

Дело в том, что мне нужно как то задать соответствие старого имени папки и нового,
например:
папку с именем "111" скрипт должен переименовать в папку с именем "папка1" т.е. хотелось бы чтобы вначале скрипта можно было задать список соответствия имен, что то типа:
set 111 = "папка1"
set 222 = "папка2"
set 333 = "папка3"
и т.д. примерно 40 папок.
т.е. если скрипт находит папку с именем "111" он ее переименовывает в "папка1" и т.д.
Хотелось бы чтобы этот список был где то вначале скрипта, потому что список этих папок нужно будет время от времени менять.

alexii пишет:

опишите принципы, по которым будет строиться соответствие.

принципов никаких нет, нужно просто задать жесткое соответствие начального имени папки и конечного.

4

Re: VBS: Переименование папок по маске

Я же писал — словарь. Пробуйте (не проверялось):

Option Explicit

Dim strSourceFolder

Dim objDictionary
Dim objFolder


strSourceFolder = "d:\2\look"

Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
    .Add "111", "папка1"
    .Add "222", "папка2"
    .Add "333", "папка3"
    .Add "444", "папка4"
End With

With WScript.CreateObject("Scripting.FileSystemObject")
    If .FolderExists(strSourceFolder) Then
        For Each objFolder In .GetFolder(strSourceFolder).SubFolders
            If objDictionary.Exists(objFolder.Name) Then
                If Not .FolderExists(.BuildPath(strSourceFolder, objDictionary.Item(objFolder.Name))) Then
                    objFolder.Name = objDictionary.Item(objFolder.Name)
                Else
                    WScript.Echo "Folder [" & objDictionary.Item(objFolder.Name) & "] already exists in folder [" & strSourceFolder & "]."
                End If
            End If
        Next
    Else
        WScript.Echo "Source folder [" & strSourceFolder & "] not found."
        WScript.Quit 1
    End If
End With

objDictionary.RemoveAll
Set objDictionary = Nothing

WScript.Quit 0

5

Re: VBS: Переименование папок по маске

Большое спасибо, это именно то, что нужно. Хорошо что есть такие форумы и люди.

6

Re: VBS: Переименование папок по маске

alexii пишет:

Я же писал — словарь. Пробуйте (не проверялось):

Option Explicit

Dim strSourceFolder

Dim objDictionary
Dim objFolder


strSourceFolder = "d:\2\look"

Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
    .Add "111", "папка1"
    .Add "222", "папка2"
    .Add "333", "папка3"
    .Add "444", "папка4"
End With

With WScript.CreateObject("Scripting.FileSystemObject")
    If .FolderExists(strSourceFolder) Then
        For Each objFolder In .GetFolder(strSourceFolder).SubFolders
            If objDictionary.Exists(objFolder.Name) Then
                If Not .FolderExists(.BuildPath(strSourceFolder, objDictionary.Item(objFolder.Name))) Then
                    objFolder.Name = objDictionary.Item(objFolder.Name)
                Else
                    WScript.Echo "Folder [" & objDictionary.Item(objFolder.Name) & "] already exists in folder [" & strSourceFolder & "]."
                End If
            End If
        Next
    Else
        WScript.Echo "Source folder [" & strSourceFolder & "] not found."
        WScript.Quit 1
    End If
End With

objDictionary.RemoveAll
Set objDictionary = Nothing

WScript.Quit 0

Здравствуйте.
Данный скрипт практически идеально подходит для моих задач, но он не переименовывает подпапки.
В моей задаче нужно переименовать подпапки с именем "number" на имя "uNumber"? Подпапки "number" находятся в папках с разным именем.
Например,
папка 3401 => подпапка number
папка 3402 => подпапка number
папка 3403 => подпапка number
и т.д.
Прошу помочь добавить правило, при котором будет происходить переименование в подпапках.

7

Re: VBS: Переименование папок по маске

smarton, попробуйте описать задачу подробнее, можете на примере.

8 (изменено: smarton, 2020-09-23 01:28:12)

Re: VBS: Переименование папок по маске

alexii,
есть список папок с числовым значением от 1000 до 4000 (этот список папок я положил в общую папку "test" на диск C),
в каждой папке с числовым значением лежит подпапка "number",
в каждой подпапке "number" лежат подпапки с другими именами, но они нас не интересуют.

Задача: просканировать все папки и подпапки, которые лежат по пути "C:\test", найти там подпапку c именем "number" и переименовать ее в "userNumber"
Скрипт, написанный выше, переименовывает папки верхнего уровня (то есть которые лежат в корне "C:\test"), но не переименовывает подпапки (субпапки), которые лежат глубже, в других папках. Нужно, чтобы скрипт сканировал все подпапки и находил нужную для ее переименования.
Буду очень благодарен помощи.

9 (изменено: smarton, 2020-09-23 10:17:10)

Re: VBS: Переименование папок по маске

Хочу еще добавить, что уровень залегания папки "number" всегда один и тот же. Если папку "test" считаем корнем, то уровень залегания - вторая.
Например:
C:\test\1001\number\533\
C:\test\1002\number\567\
C:\test\1003\number\235\
C:\test\1004\number\878\
и т.д.
То есть первая папка после "test", которая числовая - всегда переменная
Вторая папка "number", которую нужно переименовать - всегда постоянная.

Нашел аналогичное решение с помощью батча. Но хотелось бы также реализовать через VBS.


@echo off
for /f "tokens=* delims=" %%a in ('dir /ad/b "C:\test"') do (
    ren "C:\test\%%a\number" "userNumber"
)
pause

10

Re: VBS: Переименование папок по маске

Можно так:

Option Explicit

Dim strSourceFolder

Dim objRootFolder
Dim i
Dim strSubFolder


strSourceFolder = "c:\test"

With WScript.CreateObject("Scripting.FileSystemObject")
	If .FolderExists(strSourceFolder) Then
		Set objRootFolder = .GetFolder(strSourceFolder)
		
		For i = 1000 To 4000
			strSubFolder = .BuildPath(.BuildPath(objRootFolder.Path, CStr(i)), "number")
			
			If .FolderExists(strSubFolder) Then
				.GetFolder(strSubFolder).Name = "userNumber"
			Else
				WScript.Echo "Can't find subfolder [" & strSubFolder & "]."
			End If
		Next
		
		Set objRootFolder = Nothing
	Else
		WScript.Echo "Source folder [" & strSourceFolder & "] not found."
		WScript.Quit 1
	End If
End With

WScript.Quit 0