Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Синхронизация имен папок в разных директориях при помощи батника.

Ответить
Настройки темы
CMD/BAT - [решено] Синхронизация имен папок в разных директориях при помощи батника.

Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте.
В нескольких директориях расположены одинаковые папки с файлами. Неодинаковых нет, но еще могут быть разные файлы в корне.

Начало

DIR1
  • F1
  • F2
  • F3
  • x.txt

DIR2
  • F1
  • F2
  • F3
  • y.txt

DIR3
  • F1
  • F2
  • F3
  • z.txt


Как, вручную добавив в одной из директорий к названиям нескольких папок определенный префикс (в примере это "0-"),..

Изменение вручную

DIR1
  • 0-F1
  • F2
  • 0-F3
  • x.txt


...потом при помощи батника сделать те же изменения в именах папок в остальных директориях?

После батника

DIR2
  • 0-F1
  • F2
  • 0-F3
  • y.txt

DIR3
  • 0-F1
  • F2
  • 0-F3
  • z.txt


Директории в разных местах и на разную глубину, но одни и те же - их можно прописать через set=.

Префикс тоже можно прописать в переменную, по нему определить вероятное изменение, разложить названия папок на префикс и имя, и использовать их для переименования папок в других директориях.

Сложности:
- реализация возможна только стандартным батником.
- префикс может присваиваться не в одной директории, как в примере в DIR1, а в разных директориях.
- в идеале, нужна такая же обратная функция - синхронизация имен папок после удаления префикса.

Отправлено: 09:59, 02-08-2020

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


NuclearBox, быть может, Вы расскажете — зачем всё это нужно? Для решения какой задачи Вы выбрали такой способ решения?

Отправлено: 13:15, 02-08-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, Директории и папки являются частью программного обеспечения с большим количеством файлов. В них находятся как программные настройки, так и результаты выполнения программы, доступные разным сотрудникам.

Для управления этими папками удобно делать соответствующие отметки в пределах только одной директории, и запустив батник, вносить те же изменения в одноименные папки. Используя эти же метки-префиксы, можно формировать для программы новые задачи, ставить выполняемые задачи в стоп, или полностью удалять их.

Задача является развитием вот этой темы http://forum.oszone.net/post-2872146.html
Но только теперь нельзя трогать реестр (reg) для организации контекстного меню, и задач стало больше - не только удаление похожих папок.
Оптимальное решение вижу через префиксы-метки.

Отправлено: 14:37, 02-08-2020 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


NuclearBox, тогда уж лучше расширения менять для каталогов, и не трогать имена: пакетные файлы не лучший выбор для работы со строками.
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:40, 03-08-2020 | #4


Ветеран


Contributor


Сообщения: 2706
Благодарности: 1684

Профиль | Отправить PM | Цитировать


NuclearBox, подробнее об именах F1, F2, F3... Что в них, какие символы, есть ли там пробелы?
Возможно ли, например 0-0-F1, или префикс может быть присвоен только один раз
Идея Iska, кстати, мне тоже нравится больше, чем префиксы, например, F1.OLD, но это не сильно принципиально.
Цитата:
В нескольких директориях расположены одинаковые папки с файлами.
Эти директории расположены в какой-то общей папке и там необходимо просмотреть все директории, или их имена надо как-то перечислить?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 03-08-2020 в 13:26.


Отправлено: 08:50, 03-08-2020 | #5


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, так и задумано - префиксы будут применяться только к папкам (в примере F1, F2, F3), не к файлам. Если речь идет о варианте типа F1.OLD - он в принципе приемлем. Может быть "постфикс" вместо префикса. Но имена папок могут содержать свои точки в имени, и сортировка папок по началу имени удобнее, чем по окончанию имени.

megaloman, имена папок ограничены только общими правилами имен - нет кавычек, слэшей и прочего, что нельзя использовать в имени папки вручную. Могут быть пробелы, тильды, точки, кириллица, латиница, цифры... Префикс можно присваивать много раз. Главное, чтобы папки в разных директориях (в примере DIR1, DIR2, DIR3) имели одинаковые имена в каждой из них.
По поводу варианта F1.OLD - префикс выполняет роль некой метки. Метка позволит определить оригинальные имена тех папок, с которыми во всех директориях DIR (а их больше трех) необходимо выполнить какие-либо действия. Фактически, метка работает как маска для дальнейшей обработки. Например, удаления по маске, изменения по маске, включения в обработку по маске.
Цитата megaloman:
Эти директории расположены в какой-то общей папке и там необходимо просмотреть все директории, или их имена надо как-то перечислить? »
Директории не имеют общего пути, их надо перечислить через set=
Одна может находиться на C:\DIR1 , другая на C:\AAA\DIR2 , третья на C:\BBB\DIR3

Последний раз редактировалось NuclearBox, 04-08-2020 в 06:12.


Отправлено: 13:33, 03-08-2020 | #6


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


"...Напрасно ждал Наполеон..."

Отправлено: 02:20, 18-08-2020 | #7


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


Думал, задача будет не такой сложной.
Переименовав одни папки, с помощью батника переименовать одноименные им папки в заранее известных директориях, в пределах файловой системы одного компьютера.
Iska, megaloman, пожалуйста, напишите, что решения нет, если его нет. А то я подзастрял в "режиме ожидания".
В любом случае, ветеранам спасибо. Выручали не раз.

Отправлено: 22:40, 26-08-2020 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


NuclearBox, решение есть. Только выглядеть оно должно не так, как Вы описываете.

Я вижу это так:

1. Есть строка-префикс.
2. Есть путь к каталогу-источнику:
Цитата NuclearBox:
что-то там\DIR1 »
3. Есть пути к каталогам-приёмникам:
Цитата NuclearBox:
что-то там\DIR2
что-то там\DIR3
»
4. Есть имена подкаталогов, в которые нужно добавлять/удалять префикс:
Цитата NuclearBox:
F1
F3 »
Туда:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strPrefix
Dim strSourceFolder
Dim arrDestFolders
Dim arrSubFolders

Dim objFSO

Dim strDestFolder
Dim strSubFolder


strPrefix       = "0-"

strSourceFolder = "C:\Мои проекты\0319\DIR1"
arrDestFolders  = Array( _
	"C:\Мои проекты\0319\DIR2", _
	"C:\Мои проекты\0319\DIR3" _
)
arrSubFolders   = Array( _
	"F1", _
	"F3" _
)


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If Not objFSO.FolderExists(strSourceFolder) Then
	WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
	WScript.Quit 1
Else
	For Each strSubFolder In arrSubFolders
		If Not objFSO.FolderExists(objFSO.BuildPath(strSourceFolder, strSubFolder)) Then
			WScript.Echo "Can't find subfolder [" & strSubFolder & "] in source folder [" & strSourceFolder & "]."
			WScript.Quit 2
		End If
	Next
End If

For Each strDestFolder In arrDestFolders
	If Not objFSO.FolderExists(strDestFolder) Then
		WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
		WScript.Quit 3
	Else
		For Each strSubFolder In arrSubFolders
			If Not objFSO.FolderExists(objFSO.BuildPath(strDestFolder, strSubFolder)) Then
				WScript.Echo "Can't find subfolder [" & strSubFolder & "] in destination folder [" & strDestFolder & "]."
				WScript.Quit 4
			End If
		Next
	End If
Next

For Each strSubFolder In arrSubFolders
	With objFSO.GetFolder(objFSO.BuildPath(strSourceFolder, strSubFolder))
		WScript.StdOut.Write .Path & " ---> "
		.Name = strPrefix & .Name
		WScript.StdOut.WriteLine .Path
	End With
	
	For Each strDestFolder In arrDestFolders
		With objFSO.GetFolder(objFSO.BuildPath(strDestFolder, strSubFolder))
			WScript.StdOut.Write .Path & " ---> "
			.Name = strPrefix & .Name
			WScript.StdOut.WriteLine .Path
		End With
	Next
	
	WScript.StdOut.WriteLine
Next

Set objFSO = Nothing

WScript.Quit 0

и обратно:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strPrefix
Dim strSourceFolder
Dim arrDestFolders
Dim arrSubFolders

Dim objFSO

Dim strDestFolder
Dim strSubFolder


strPrefix       = "0-"

strSourceFolder = "C:\Мои проекты\0319\DIR1"
arrDestFolders  = Array( _
	"C:\Мои проекты\0319\DIR2", _
	"C:\Мои проекты\0319\DIR3" _
)
arrSubFolders   = Array( _
	"F1", _
	"F3" _
)


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If Not objFSO.FolderExists(strSourceFolder) Then
	WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
	WScript.Quit 1
Else
	For Each strSubFolder In arrSubFolders
		If Not objFSO.FolderExists(objFSO.BuildPath(strSourceFolder, strPrefix & strSubFolder)) Then
			WScript.Echo "Can't find subfolder [" & strPrefix & strSubFolder & "] in source folder [" & strSourceFolder & "]."
			WScript.Quit 2
		End If
	Next
End If

For Each strDestFolder In arrDestFolders
	If Not objFSO.FolderExists(strDestFolder) Then
		WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
		WScript.Quit 3
	Else
		For Each strSubFolder In arrSubFolders
			If Not objFSO.FolderExists(objFSO.BuildPath(strDestFolder, strPrefix & strSubFolder)) Then
				WScript.Echo "Can't find subfolder [" & strPrefix & strSubFolder & "] in destination folder [" & strDestFolder & "]."
				WScript.Quit 4
			End If
		Next
	End If
Next

For Each strSubFolder In arrSubFolders
	With objFSO.GetFolder(objFSO.BuildPath(strSourceFolder, strPrefix & strSubFolder))
		WScript.StdOut.Write .Path & " ---> "
		.Name = Mid(.Name, Len(strPrefix) + 1)
		WScript.StdOut.WriteLine .Path
	End With
	
	For Each strDestFolder In arrDestFolders
		With objFSO.GetFolder(objFSO.BuildPath(strDestFolder, strPrefix & strSubFolder))
			WScript.StdOut.Write .Path & " ---> "
			.Name = Mid(.Name, Len(strPrefix) + 1)
			WScript.StdOut.WriteLine .Path
		End With
	Next
	
	WScript.StdOut.WriteLine
Next

Set objFSO = Nothing

WScript.Quit 0

На WSH. Если будете исполнять не под cscript.exe, а под умолчальным wscript.exe — закомментируйте WScript.StdOut.Write/WScript.StdOut.WriteLine'ы.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:26, 27-08-2020 | #9


Ветеран


Contributor


Сообщения: 2706
Благодарности: 1684

Профиль | Отправить PM | Цитировать


CMD - Добавление префикса
Код: Выделить весь код
@Echo Off
cls
	Set DAll="Z:\Box_In\Dir1" "Z:\Box_In\Dir2" "Z:\Box_In\Dir3" "D:\Май гад!"
	Set "Pref=0-"

	2>nul Del "%Temp%\%~nx0.In"
	FOR /D %%d IN (%DAll%) DO FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%%~d" /B /A:D`) DO (
		Set "Name=%%~i"
		Call :OutIn "%%Name:%Pref%=%%" "%%~i" "%%~d\%%i"
	)
	Set "TName=:"
	FOR /F "usebackq tokens=1,2,3* delims=:" %%i IN (`2^>nul Sort /R "%Temp%\%~nx0.In"`) DO (
		Call :RenAll %%i %%j %%k %%l

	)
	2>nul Del "%Temp%\%~nx0.In"
Pause
Exit /B

:OutIn
	Set "Nall=%~2"
	Set "NN=%~1"
	Call Set "NN=%%Nall:%NN%=%%"
	>>"%Temp%\%~nx0.In" Echo %1:"%NN%":%2:%3
	
Exit /B

:RenAll
	If /I Not "%TName%"=="%~1" (
		Set "TName=%~1"
		Set "RName=%3"
	)
	If /I Not "%~nx4"==%RName% Echo Ren %4 %RName% &Ren %4 %RName% 
Exit /B
CMD - Удаление префикса
Код: Выделить весь код
@Echo Off
cls
	Set DAll="Z:\Box_In\Dir1" "Z:\Box_In\Dir2" "Z:\Box_In\Dir3" "D:\Май гад!"
	Set "Pref=0-"

	2>nul Del "%Temp%\%~nx0.In"
	FOR /D %%d IN (%DAll%) DO FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%%~d" /B /A:D`) DO (
		Set "Name=%%~i"
		Call :OutIn "%%Name:%Pref%=%%" "%%~i" "%%~d\%%i"
	)
	Set "TName=:"
	FOR /F "usebackq tokens=1,2,3* delims=:" %%i IN (`2^>nul Sort "%Temp%\%~nx0.In"`) DO (
		Call :RenAll %%i %%j %%k %%l

	)
	2>nul Del "%Temp%\%~nx0.In"
Pause
Exit /B

:OutIn
	Set "Nall=%~2"
	Set "NN=%~1"
	Call Set "NN=%%Nall:%NN%=%%"
	>>"%Temp%\%~nx0.In" Echo %1:"%NN%":%2:%3
	
Exit /B

:RenAll
	If /I Not "%TName%"=="%~1" (
		Set "TName=%~1"
		Set "RName=%3"
	)
	If /I Not "%~nx4"==%RName% Echo Ren %4 %RName% &Ren %4 %RName% 
Exit /B
Коды отличаются только ключом сортировки /R в первом случае

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-08-2020 в 18:42.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:22, 28-08-2020 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Синхронизация имен папок в разных директориях при помощи батника.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Вывод на экран имен двух одинаковых файлов, находящихся в разных папках. taori Скриптовые языки администрирования Windows 2 25-01-2015 23:23
CMD/BAT - Архивирование с удалением каталога при помощи запуска батника из того же каталога HAMMER7 Скриптовые языки администрирования Windows 0 09-04-2012 20:29
CMD/BAT - [решено] login\logoff запись времени при помощи батника xvoct Скриптовые языки администрирования Windows 15 20-04-2010 19:56
Добавить свои команды\программы в контекстное меню Папок и Корзины при помощи твиков! prokazzza Автоматическая установка Windows 2000/XP/2003 10 12-01-2009 06:38
Как настроить разрешение имен в DNS в двух разных доменах? DeeNamid Microsoft Windows NT/2000/2003 26 13-10-2008 17:57




 
Переход