Войти

Показать полную графическую версию : [решено] Переименование папки, на основе файла внутри папки


KoRn0509
26-10-2020, 14:08
Приветствую. Нужна ваша помощь. Есть набор папок такого вида
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
Спасибо.

greg zakharov
26-10-2020, 15:17
Задача в одно выражение на pwsh.
(Get-ChildItem E:\123 -Recurse -File).ForEach{
Rename-Item $_.DirectoryName "$($_.DirectoryName) $($_.Basename)"
}

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

megaloman
26-10-2020, 16:07
@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 - файлов, папка будет переименована по имени первого файла. А Вам что надо - формулируйте задачу, а не предоставляйте чужой код.

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

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




© OSzone.net 2001-2012