Войти

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


michsh@vk
14-05-2020, 17:15
Всем добрый день, понадобился скрипт, не требующий прав администратора, который будет обрезать длину файла (например до 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
Это:
set "d=D:\test" »
решение — ни разу не однокликовое :). Однокликовое — это Far Manager :).

michsh@vk
15-05-2020, 13:44
Iska, если юзерам показать Far Manager, то меня запинают ногами(

Fors1k
15-05-2020, 14:15
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
Fors1k_m, как обычно, не хватает проверки на дубликаты.

Fors1k
15-05-2020, 16:23
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
Fors1k_m, я не конкретно про Вас, я про общую ошибку такого рода — где гарантия, что новое имя не совпадает с именем уже существующего файла.

Fors1k
15-05-2020, 17:43
Fors1k_m, я не конкретно про Вас, я про общую ошибку такого рода »
Понятно)

michsh@vk
15-05-2020, 19:22
Fors1k_m, благодарю Вас за помощь. Расширение файла в длине можно не учитывать, главное его само название. К сожалению, я обнаружил ту же самую проблему с — в имени файла.

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

Fors1k
15-05-2020, 20:25
Когда документ имеет подобное название, скрипт не отрабатывает. »
Странно, у меня код работает.
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
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
megaloman, огромное спасибо! Этот скрипт работает идеально!




© OSzone.net 2001-2012