Компьютерный форум 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=345192)

michsh@vk 14-05-2020 17:15 2921132

Скрипт для обрезки имени файлов
 
Всем добрый день, понадобился скрипт, не требующий прав администратора, который будет обрезать длину файла (например до 120 символов), и будет добавлять счетчик, чтобы не оказалось файлов-дублей.

Я нашел на просторах интернета такой скрипт:

Код:

@echo off
set "d=D:\test"
set "lim=120"
for /f "delims=" %%a in ('2^>nul dir /a-d/b/s "%d%"') do call :l "%%a"
pause& exit
 
:l
 set "nf=%~n1"& set/a n+=1
 cmd/v/c "if not exist "!nf:~,%lim%!%n%%~x1" (ren "%~1" "!nf:~,%lim%!%n%%~x1") else (goto l)"
exit /b

Но у него есть минус: он как минимум не работает с файлами в имени которых есть "—".
Может ли кто помочь его исправить или сделать аналогичный?

P.S. До этого я делал через Total Commander, но сейчас нужно одно-кликовое решение, потому что оно нужно для эксплуатации самым простым пользователем.

Iska 14-05-2020 23:45 2921180

Это:
Цитата:

Цитата michsh@vk
set "d=D:\test" »

решение — ни разу не однокликовое :). Однокликовое — это Far Manager :).

michsh@vk 15-05-2020 13:44 2921251

Iska, если юзерам показать Far Manager, то меня запинают ногами(

Fors1k 15-05-2020 14:15 2921257

Код:

param(
    $Path  = 'D:\test',
    $Length = 120
)cls

gci $path -file|?{$_.basename.length -gt $Length}|%{ren $_.fullname $($_.basename.Substring(0,$Length)+$_.extension)}


Iska 15-05-2020 15:34 2921267

Fors1k_m, как обычно, не хватает проверки на дубликаты.

Fors1k 15-05-2020 16:23 2921273

Iska, в плане "как обычно"? Это же мой первый тут ответ.= )
А саму проверку сделать не проблема. Только не понятно, 120 символов - это длина с расширением или без? Если счетчик добавить,
то будет длина 120+счетчик(+?расширение)?
В общем решил дождаться реакции автора на первый код, так как все равно, скорее всего, пришлось бы дописывать)
Код:

param(
    $Path  = 'D:\test',
    $Length = 120
)cls

gci $path -file|?{$i++;$_.basename.length -gt $Length}|%{ren $_.fullname $($_.basename.Substring(0,$Length)+$i+$_.extension)}

Надеюсь то, что требовалось.

Iska 15-05-2020 17:07 2921279

Fors1k_m, я не конкретно про Вас, я про общую ошибку такого рода — где гарантия, что новое имя не совпадает с именем уже существующего файла.

Fors1k 15-05-2020 17:43 2921290

Цитата:

Цитата Iska
Fors1k_m, я не конкретно про Вас, я про общую ошибку такого рода »

Понятно)

michsh@vk 15-05-2020 19:22 2921306

Fors1k_m, благодарю Вас за помощь. Расширение файла в длине можно не учитывать, главное его само название. К сожалению, я обнаружил ту же самую проблему с — в имени файла.

Когда документ имеет подобное название, скрипт не отрабатывает.
Новый текстовый документ Новый текстовый документ Новый текстовый документ Новый текстовый документ Новый текстовый документ 12345 — копия (3).txt
причем часть "копия (3)" не причем. Ругается именно на длинное тире, и командный интерпретатор пишет: Не удается найти указанный файл.

Fors1k 15-05-2020 20:25 2921320

Цитата:

Цитата michsh@vk
Когда документ имеет подобное название, скрипт не отрабатывает. »

Странно, у меня код работает.
Код:

param(
    $Path  = 'D:\test',
    $Length = 120
)cls

'До: '+(gci $path -file).BaseName;""
gci $path -file|?{$i++;$_.basename.length -gt $Length}|%{ren $_.fullname $($_.basename.Substring(0,$Length)+$i+$_.extension)}
'После: '+(gci $path -file).BaseName

Результат:
Код:

До: Новый текстовый документ Новый текстовый документ Новый текстовый документ Новый текстовый документ Новый текстовый документ 12345 — копия (3)

После: Новый текстовый документ Новый текстовый документ Новый текстовый документ Новый текстовый документ Новый текстовый доку1

Имя файла содержало ' — ' , и после обработки имя успешно урезано до желаемой длины.

megaloman 15-05-2020 20:38 2921324

michsh@vk, попробуйте, с Вашим символом работает
Код:

@Echo Off
cls
        >nul chcp 1251
        Set "BoxIn=Z:\Box_IN"
        Set /A L=120
       
        Call :ReNum "%BoxIn%" %L%
        FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /S /B /A:D`) DO Call :ReNum "%%d" %L%
pause
Exit /B

:ReNum
        Set /A M=0
        Pushd %1 || Exit /B

        >"%TMP%\%~nx0.txt" (FOR %%f IN (*.*) DO Echo %%f)
        FOR /F "usebackq delims=" %%f IN ("%TMP%\%~nx0.txt") DO Call Set /A M+=1 &Ren "%%f" "~~~%%~nxf"
        Set /A M=1%M%-%M%
        FOR %%f IN (~~~*.*) DO (
                Set /A M+=1
                Set "N=%%~nf"
                Call Ren "%%f" "%%N:~3,%2%%_%%M:~1%%%%~xf"
        )
        Popd
Exit /B 0


michsh@vk 16-05-2020 12:21 2921384

megaloman, огромное спасибо! Этот скрипт работает идеально!


Время: 11:33.

Время: 11:33.
© OSzone.net 2001-