|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Синхронизация имен папок в разных директориях при помощи батника. |
|
|
CMD/BAT - [решено] Синхронизация имен папок в разных директориях при помощи батника.
|
Пользователь Сообщения: 59 |
Профиль | Отправить PM | Цитировать Здравствуйте.
В нескольких директориях расположены одинаковые папки с файлами. Неодинаковых нет, но еще могут быть разные файлы в корне. Начало
DIR1
DIR2
DIR3
Как, вручную добавив в одной из директорий к названиям нескольких папок определенный префикс (в примере это "0-"),.. Изменение вручную
DIR1
...потом при помощи батника сделать те же изменения в именах папок в остальных директориях? После батника
DIR2
DIR3
Директории в разных местах и на разную глубину, но одни и те же - их можно прописать через set=. Префикс тоже можно прописать в переменную, по нему определить вероятное изменение, разложить названия папок на префикс и имя, и использовать их для переименования папок в других директориях. Сложности: - реализация возможна только стандартным батником. - префикс может присваиваться не в одной директории, как в примере в DIR1, а в разных директориях. - в идеале, нужна такая же обратная функция - синхронизация имен папок после удаления префикса. |
|
Отправлено: 09:59, 02-08-2020 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать NuclearBox, быть может, Вы расскажете — зачем всё это нужно? Для решения какой задачи Вы выбрали такой способ решения?
|
Отправлено: 13:15, 02-08-2020 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать Iska, Директории и папки являются частью программного обеспечения с большим количеством файлов. В них находятся как программные настройки, так и результаты выполнения программы, доступные разным сотрудникам.
Для управления этими папками удобно делать соответствующие отметки в пределах только одной директории, и запустив батник, вносить те же изменения в одноименные папки. Используя эти же метки-префиксы, можно формировать для программы новые задачи, ставить выполняемые задачи в стоп, или полностью удалять их. Задача является развитием вот этой темы http://forum.oszone.net/post-2872146.html Но только теперь нельзя трогать реестр (reg) для организации контекстного меню, и задач стало больше - не только удаление похожих папок. Оптимальное решение вижу через префиксы-метки. |
Отправлено: 14:37, 02-08-2020 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать NuclearBox, тогда уж лучше расширения менять для каталогов, и не трогать имена: пакетные файлы не лучший выбор для работы со строками.
|
Отправлено: 06:40, 03-08-2020 | #4 |
Ветеран Сообщения: 2706
|
Профиль | Отправить PM | Цитировать NuclearBox, подробнее об именах F1, F2, F3... Что в них, какие символы, есть ли там пробелы?
Возможно ли, например 0-0-F1, или префикс может быть присвоен только один раз Идея Iska, кстати, мне тоже нравится больше, чем префиксы, например, F1.OLD, но это не сильно принципиально. Цитата:
|
||
------- Последний раз редактировалось megaloman, 03-08-2020 в 13:26. Отправлено: 08:50, 03-08-2020 | #5 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать Iska, так и задумано - префиксы будут применяться только к папкам (в примере F1, F2, F3), не к файлам. Если речь идет о варианте типа F1.OLD - он в принципе приемлем. Может быть "постфикс" вместо префикса. Но имена папок могут содержать свои точки в имени, и сортировка папок по началу имени удобнее, чем по окончанию имени.
megaloman, имена папок ограничены только общими правилами имен - нет кавычек, слэшей и прочего, что нельзя использовать в имени папки вручную. Могут быть пробелы, тильды, точки, кириллица, латиница, цифры... Префикс можно присваивать много раз. Главное, чтобы папки в разных директориях (в примере DIR1, DIR2, DIR3) имели одинаковые имена в каждой из них. По поводу варианта F1.OLD - префикс выполняет роль некой метки. Метка позволит определить оригинальные имена тех папок, с которыми во всех директориях DIR (а их больше трех) необходимо выполнить какие-либо действия. Фактически, метка работает как маска для дальнейшей обработки. Например, удаления по маске, изменения по маске, включения в обработку по маске. Цитата megaloman:
Одна может находиться на C:\DIR1 , другая на C:\AAA\DIR2 , третья на C:\BBB\DIR3 |
|
Последний раз редактировалось NuclearBox, 04-08-2020 в 06:12. Отправлено: 13:33, 03-08-2020 | #6 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать "...Напрасно ждал Наполеон..."
|
Отправлено: 02:20, 18-08-2020 | #7 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать Думал, задача будет не такой сложной.
Переименовав одни папки, с помощью батника переименовать одноименные им папки в заранее известных директориях, в пределах файловой системы одного компьютера. Iska, megaloman, пожалуйста, напишите, что решения нет, если его нет. А то я подзастрял в "режиме ожидания". В любом случае, ветеранам спасибо. Выручали не раз. |
Отправлено: 22:40, 26-08-2020 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать NuclearBox, решение есть. Только выглядеть оно должно не так, как Вы описываете.
Я вижу это так: 1. Есть строка-префикс. 2. Есть путь к каталогу-источнику: Цитата NuclearBox:
Цитата NuclearBox:
Цитата NuclearBox:
Скрытый текст
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 |
Ветеран Сообщения: 2706
|
Профиль | Отправить 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 |
------- Последний раз редактировалось megaloman, 28-08-2020 в 18:42. Отправлено: 14:22, 28-08-2020 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|