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

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

Ответить
Настройки темы
CMD/BAT - [решено] Переименование папки, на основе файла внутри папки

Старожил


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


Конфигурация

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


Изменения
Автор: KoRn0509
Дата: 26-10-2020
Приветствую. Нужна ваша помощь. Есть набор папок такого вида
E:\123\123\405734043
E:\123\123\405794502
E:\123\123\405804760

В каждой папке лежит файл
Small parking lot.crp
Relax Park 4x4.crp
Your on road park 1x1.crp

В итоге получается такой вид
E:\123\123\405734043\Small parking lot.crp
E:\123\123\405794502\Relax Park 4x4.crp
E:\123\123\405804760\Your on road park 1x1.crp

Есть вот такой скрипт

Код: Выделить весь код
:start
rem Start folder
set folder1="E:\123\123\405734043\"
for /d %%Z in ("%folder1:~1,-1%\*.*") do (
if NOT %%~nZ==Park (
rem firstfolder
for /d %%i in ("%%Z\*.*") do (
rem mode directory %%i
for %%f in ("%%i\*.crp") do (
call :shortname "%%~ni" "%%~i" "%%~Z" "%%~nf"
echo. ))))
exit
:shortname
set shrt="%~1"
set upd=%shrt:~1,6%
if %upd%==Update (goto :end)
echo "%~2" compare with
echo "%~3\%shrt:~1,9% %~4"
set old="%~2"
set new="%~3\%shrt:~1,9% %~4"
if NOT %new%==%old% (if NOT "%~4"=="NewAsset" (move "%~2" "%~3\%shrt:~1,9% %~4")) ELSE echo name exists
:end
echo.
Который берет название файла из папки и приписывает его к названию папки.
В итоге получается такой вид.

E:\123\123\405734043 Small parking lot
E:\123\123\405794502 Relax Park 4x4
E:\123\123\405804760 Your on road park 1x1

Дело в том что папки имеют 9 символов, но беда в том что, если папка будет иметь 10 символов к примеру
E:\123\123\2240880754\İSTANBULL.crp

То данный скрипт удалит последнюю цифру и конечный вид будет
E:\123\123\224088075 İSTANBULL

Автор данного скрипта не выходит на связь. Можете помочь сделать так что бы и 9 и 10 цифр работали адекватно и не удалялась 1 цифра в случае когда их 10
Спасибо.

Отправлено: 14:08, 26-10-2020

 

Забанен


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

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


Задача в одно выражение на pwsh.
Код: Выделить весь код
(Get-ChildItem E:\123 -Recurse -File).ForEach{
   Rename-Item $_.DirectoryName "$($_.DirectoryName) $($_.Basename)"
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:17, 26-10-2020 | #2



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

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


Старожил


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

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


greg zakharov,
Ну то что имеем. Этому скрипту уже лет 6.
А тот что на pwsh, он будет работать с любым расширением? И если в папке несколько файлов то он будет работать?

Последний раз редактировалось KoRn0509, 26-10-2020 в 15:55.


Отправлено: 15:32, 26-10-2020 | #3


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
	Set "BoxIn=E:\123\123"
	Set "Mask=*.crp"

	FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%\" /A:D /B ^|FINDSTR /X /R /C:"^[0-9]*$"`) DO (
		For %%f In ("%BoxIn%\%%d\%Mask%") Do 2>nul Ren "%BoxIn%\%%d" "%%d %%~nf"
	)
Exit /B
Я вставил контроль на имя папок: они должны содержать только цифры, для того, чтобы при повторном запуске обработанные папки не переименовывались еще раз.
Если в папке несколько .crp - файлов, папка будет переименована по имени первого файла. А Вам что надо - формулируйте задачу, а не предоставляйте чужой код.

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


Последний раз редактировалось megaloman, 26-10-2020 в 16:17.

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

Отправлено: 16:07, 26-10-2020 | #4


Старожил


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

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


greg zakharov, Спасибо, отлично работает. Только если повторно запустить, он по второму кругу добавит, но это не беда.
megaloman, Надо что бы брался первый. Вот то что надо. Как я понимаю, .crp можно заменить на любое другое расширения и будет работать?

Отправлено: 16:27, 26-10-2020 | #5


Забанен


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

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


KoRn0509, про повторный запуск ничего не оговаривалось, но это легко исправить путем добавления проверки соответствия имен (папки и файла).
Код: Выделить весь код
(Get-ChildItem E:\123 -Recurse -File).ForEach{
  if ($_.DirectoryName -notlike "*$($_.Basename)") {
    Rename-Item $_.DirectoryName "$($_.DirectoryName) $($_.Basename)"
  }
}

Последний раз редактировалось greg zakharov, 26-10-2020 в 16:44.

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

Отправлено: 16:39, 26-10-2020 | #6



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Странное название папки hotrout Microsoft Windows 10 8 01-10-2016 21:53
CMD/BAT - Название папки на серваке - IP компа blackkardinal@vk Скриптовые языки администрирования Windows 4 17-08-2015 10:00
CMD/BAT - [решено] Получить название папки из пути Mad Max Скриптовые языки администрирования Windows 5 29-01-2015 22:53
универсальное название папки icetanker AutoIt 9 28-03-2014 16:27
Интерфейс - [решено] Помогите изменить название папки laslo1405 Microsoft Windows 7 7 14-09-2013 09:02




 
Переход