Войти

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


habib2302
06-04-2019, 21:57
Доброе время суток. Я не силен в CMD/BAT, поэтому прошу помощи. Нужно удалить у всех файлов в папке первые 2 символа в имени не затрагивая расширение файла. У меня имеется готовый батник, но только на удаление последних 2 символов.
@echo off
setlocal enabledelayedexpansion
for %%i in ( *.* ) do (
set "name=%%~ni"
set "name=!name:~0,-2!"
rename "%%~i" !name!%%~xi
echo !name!%%~xi
)
pause

mwz
06-04-2019, 22:05
habib2302, тут где-то рядышком сегодня один уже удаляли...

habib2302
06-04-2019, 22:08
mwz, скорей всего это http://forum.oszone.net/thread-335923.html

mwz
06-04-2019, 22:13
habib2302, ну и замените количество хоть на два (как у вас в тексте), хоть на четыре (как у вас в заголовке темы).

habib2302
06-04-2019, 22:25
mwz, пробовал. не работает. Ошибка в синтаксисе команды.
@echo off
setlocal enabledelayedexpansion
for %%i in ( *.* ) do (
set "name=%%~ni"
set "name=!name:~4!"
rename "%%~i" !name!%%~xi
echo !name!%%~xi
)
pause

alpap
06-04-2019, 23:00
habib2302,
когда копипастите откуда-то следите за пробелами в конце строк - очень распространенная ошибка причина и имя файла и путь когда в переменной надо обязательно брать в парные кавычки

@echo off
setlocal enabledelayedexpansion

for %%i in (*.*) do (
set "name=%%~ni"
set "name=!name:~4!"
ren "%%~i" "!name!%%~xi"
)
pause

Iska
06-04-2019, 23:03
@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in (*.*) do (
set "name=%%~ni"
rename "%%~i" "!name:~4!%%~xi"
)

endlocal
exit /b 0

habib2302, в любом случае — делать rename файлов внутри цикла перебора тех же самых файлов по for — не есть правильно. Делайте разбор по for /f для команды dir /b — и вот тогда смело переименовывайте: сначала выполнится dir /b, и только потом произойдёт первое переименование.

Update: припоздал.

mwz
06-04-2019, 23:04
Ошибка в синтаксисе команды »

На время отладки строку @echo off надо убирать. И смотреть, где ошибка (ошибки).
Да, и у вас заодно от имени батника отрежутся символы. ;)

Кстати... А что вы будете делать, если получите одинаковые имена переименованных файлов?

megaloman
08-04-2019, 15:37
habib2302, Одно неверное движение, и ты отец ...ИМХО, указывать имена файлов *.* опрометчиво. При повторном возможно случайном запуске батника тупо повторно отрежутся символы. Подозреваю, можно указать маску, чтобы повторно файлы не обрабатывались.Да, и у вас заодно от имени батника отрежутся символы. »ИМХО, скверная политика запускать батник из той же папки, где обрабатываемые файлы. Поэтому, для обрабатываемых файлов лучше указывать полный путь с маской, и, (но это не нужно, если не располагать батник вместе с файлами) можно приделать батнику атрибут "скрытый".
До кучи (число отрезаемых символов тоже задаётся, а то завтра кто-то захочет отрезать 2 или 5 символов)@Echo Off
Set "FileIn=Z:\Box_In\я*.txt"
Set /A N=4

Attrib +H "%~dpnx0"
FOR %%i IN ("%FileIn%") DO (Set "NN=%%~ni" &Call Ren "%%i" "%%NN:~%N%%%%%~xi")
Exit /B 0
Или, как вариант, перед обрезанием контролировать длину, чтобы не отрезать повторно: возможно, обрабатываемые файлы имеют некое стандартное по длине имя. Или всё-таки на каждое переименование организовать запрос. Но это слегка другая песТня, излагайте!

megaloman
08-04-2019, 16:32
в любом случае — делать rename файлов внутри цикла перебора тех же самых файлов по for — не есть правильно »@Echo Off
Set "FileIn=Z:\Box_In\я*.txt"
Set /A N=4

>"%~dpn0.tmp%~x0" (FOR %%i IN ("%FileIn%") DO (
Set "NN=%%~ni"
Call Echo Ren "%%i" "%%NN:~%N%%%%%~xi"
))
Attrib +H "%~dpnx0"
Attrib +H "%~dpn0.tmp%~x0"
Call "%~dpn0.tmp%~x0"
Attrib -H "%~dpnx0"
Attrib -H "%~dpn0.tmp%~x0"
Del "%~dpn0.tmp%~x0"
Exit /B 0




© OSzone.net 2001-2012