Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование папки, на основе файла внутри папки (http://forum.oszone.net/showthread.php?t=346822)

KoRn0509 26-10-2020 14:08 2937610

Переименование папки, на основе файла внутри папки
 
Приветствую. Нужна ваша помощь. Есть набор папок такого вида
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 2937621

Задача в одно выражение на pwsh.
Код:

(Get-ChildItem E:\123 -Recurse -File).ForEach{
  Rename-Item $_.DirectoryName "$($_.DirectoryName) $($_.Basename)"
}


KoRn0509 26-10-2020 15:32 2937624

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

megaloman 26-10-2020 16:07 2937630

Код:

@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 2937633

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

greg zakharov 26-10-2020 16:39 2937635

KoRn0509, про повторный запуск ничего не оговаривалось, но это легко исправить путем добавления проверки соответствия имен (папки и файла).
Код:

(Get-ChildItem E:\123 -Recurse -File).ForEach{
  if ($_.DirectoryName -notlike "*$($_.Basename)") {
    Rename-Item $_.DirectoryName "$($_.DirectoryName) $($_.Basename)"
  }
}



Время: 22:17.

Время: 22:17.
© OSzone.net 2001-