|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Переименование. Заменить часть символов в имени файла. |
|
CMD/BAT - [решено] Переименование. Заменить часть символов в имени файла.
|
Пользователь Сообщения: 105 |
Здравствуйте.
В директории есть файлы .xls, имена которых заканчиваются на "_21" Помогите пожалуйста их переименовать на "_2021" Также прошу помощи, как в заданной директории у файлов, у которых в имени встречается символ "." заменить на символ "_" Заранее Спасибо! |
|
Отправлено: 00:16, 14-05-2021 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать epoddubniy, Вам обязательна на пакетных файлах реализация? Powershell не подойдёт?
|
Отправлено: 17:03, 14-05-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать да я вообще не понимаю ТС, он уже создавал тему в которой присутствовал момент переименования и был показан в коде, только создать новую тему не лень. а зайти в свою предыдущую лень - абсурд.
|
Отправлено: 17:11, 14-05-2021 | #3 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать вот прямолинейный (и даже нет, я из предыдущей темы ТС знаю что 21 и 2021 это год, а не просто цифры, поэтому и в этой теме условие задачи неполное или неверное) подход:
$a = @( '408aaaa_21.xls' '4082222_21.xls' ) $oldPsf = '_{0:yy}' -f (Get-Date) $newPsf = '_{0:yyyy}' -f (Get-Date) $a|% {$_ -Replace $oldPsf, $newPsf} --- и я смотрю мы тут ему уже не раз что-то переименовывали. Может проще вскрыть карты и описать задачу целиком, только по человечески, а не как раньше: Происходит это потом это ... Задача ставится так --- Директория такая-то - есть, создана С сервера или откуда там приходят файлы в такую-то директорию с такой-то интенсивностью с такой-то маской Запуск (соответственно проверка наличия файлов) кода будет производится (возможно из планировщика) вручную раз в месяц (неделю) Надо отобрать по маске или по дате файлы все или по столько-то штук из общей папки и разложить в другие папки (если их нет, то создать, имена папок должны содержать часть имени файла и дату из имени файла или свойства файла) |
Последний раз редактировалось alpap, 14-05-2021 в 17:57. Отправлено: 17:43, 14-05-2021 | #4 |
Ветеран Сообщения: 2733
|
Профиль | Отправить PM | Цитировать Цитата epoddubniy:
@Echo Off cls Set "BoxIn=Z:\Box_In" Set "Find=_21.xls" Set "Repl=_2021.xls" For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*%Find%"`) Do ( Set "Name=%%~nxf" Call Ren "%BoxIn%\%%f" %%Name:%Find%=%Repl%%% ) pause Exit /B @Echo Off cls Set "BoxIn=Z:\Box_In" Set "Find=^.*_[1-2][0-9]\.xls$" For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*.*" ^| findstr.exe /R /I /C:"%Find%"`) Do ( Set "Name=%%~nxf" Call Ren "%BoxIn%\%%f" "%%Name:~0,-6%%20%%Name:~-6%%" ) pause Exit /B Цитата epoddubniy:
@Echo Off cls Set "BoxIn=Z:\Soft_In" Set "Find=." Set "Repl=_" For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*.*"`) Do ( Set "Name=%%~nf" Call Ren "%BoxIn%\%%f" "%%Name:%Find%=%Repl%%%%%~xf" ) pause Exit /B Цитата alpap:
Цитата «Бе́лое со́лнце пусты́ни»:
![]() |
|||||
------- Последний раз редактировалось megaloman, 14-05-2021 в 21:52. Отправлено: 21:32, 14-05-2021 | #5 |
Пользователь Сообщения: 105
|
Профиль | Отправить PM | Цитировать Цитата alpap:
Цитата Iska:
Цитата alpap:
Цитата megaloman:
если его заменить на то интерпретатор не вылетает и выводятся имена файлов в каталоге с расширением megaloman, скажите пожалуйста, правильно ли я понял кусок кода? For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*%Find%"`) Do ( Set "Name=%%~nxf" Call Ren "%BoxIn%\%%f" %%Name:%Find%=%Repl%%% ) 2) Dir /B /A:-D "%BoxIn%\*%Find%" - получаем список имен файлов в целевой директории, у которых имя имеет маску "*_21" 3) Set "Name=%%~nxf" - у каждого файла оставляем только имя и расширение, путь отбрасывается 4) Call Ren - вызываем команду Rename 5) Call Ren "%BoxIn%\%%f" - осуществляем переименование в каталоге BoxIn файлов %%F, а так как в переменной цикла %%F сохранено значение имен файлов с маской "*_21", то они по очереди будут подставляться 6) %%Name:%Find%=%Repl%%% - вот это - не понял :-( Понимаю, что синтаксис команды rename подразумевает переименование того, что было "%BoxIn%\%%f" на то, что будет %%Name:%Find%=%Repl%%%, но то, как это получается - не понятно почему у %%Name двойной знак процента, как у переменной цикла, почему потом стоит двоеточие (что это за синтаксис и для чего он используется) равенство в выражении означает, что присваивается значение %repl%, ну то есть, если я правильно понимаю, каждый %find% меняется на %repl% а для чего после %repl% стоят двойные знаки процента? Заменил на скрипт отработал, файлы переименовались, но осталась неясность с Цитата:
|
||||||
Последний раз редактировалось epoddubniy, 16-05-2021 в 11:44. Причина: Редактирование Отправлено: 10:26, 16-05-2021 | #6 |
Ветеран Сообщения: 2733
|
Профиль | Отправить PM | Цитировать epoddubniy, Давайте договариваться: Вы берёте мой код, сохраняете его в текстовый файл с расширением .bat в 866 кодировке и запускаете его на выполнение. Потом по факту рассказываете, что работает, а что брыкается.
Я еще раз проверил исполнение моих кодов - работают. Разъяснение кода (опять же - все коды примеров сохраняем в файл с расширением .bat и запускаем на выполнение)
Dir /B /A:-D "%BoxIn%\*%Find%" - получаем список имен файлов в целевой директории, у которых имя имеет маску "*_21.xls" Обсудим поведение переменных в цикле (извините, если излагаю известное). Для отладки, вот код: @Echo Off cls Set "BoxIn=Z:\Box_In" Set "Find=_21.xls" Set "Repl=_2021.xls" Set "Name=kuku" For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*%Find%"`) Do ( Set "Name=%%~nxf" Echo %Name%===="%%~nxf" ) Echo %Name% pause Exit /B Echo %Name%===="%%~nxf" выдаёт значение %Name% определённое до цикла, а после цикла Echo %Name% выдаст последнее значение, присвоенное %Name% в цикле. Такие реалии раскрытия переменной в цикле. Чтобы раскрытие переменной работало корректно, применим вместо Проделайте и убедитесь, что работает ожидаемо. То есть, Name заключили с двух сторон в двойные %% и вызвали команду через Call Альтернатива
Но я стараюсь не применять этот способ, так как если в имени присутствуен "!" то код корректно не отработается.
Аналогичная история с Ren. Но тут еще надо почитать хелп к Set /? Цитата хелп к Set:
str1 это %Find%, str2 это %Repl% То есть в имени файла подстроку _21.xls заменим на _2021.xls, чего Вы и домогались. |
|
------- Отправлено: 14:15, 16-05-2021 | #7 |
Пользователь Сообщения: 105
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
|
Отправлено: 15:54, 20-05-2021 | #8 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - удалить первые 7 символов в имени файла | ВиталийВ | Скриптовые языки администрирования Windows | 14 | 02-08-2024 01:29 | |
Переименование имени файла fb2 в соответствии с тэгами | DenchikK | AutoIt | 9 | 17-04-2020 12:34 | |
CMD/BAT - [решено] Переименование имени файла по маске | Дмитрий_Кульгейко@vk | Скриптовые языки администрирования Windows | 10 | 12-07-2016 20:15 | |
VBS/WSH/JS - Переименовать файлы (заменить часть имени) | Fresh96 | Скриптовые языки администрирования Windows | 4 | 15-01-2014 18:26 | |
CMD/BAT - [решено] Как из имени файла убрать 11 символов | cdp75 | Скриптовые языки администрирования Windows | 3 | 26-04-2012 06:07 |
|