Показать полную графическую версию : [решено] Добавление к имени файла имя папки
Arsenik77
13-08-2011, 14:22
Нужен батник который добавляет к имени файла имя папки где он находится
например: есть c:\Down\RRR\1.jpg надо c:\Down\RRR_1.jpg
Папка Down основная, в неё записываются разные папки и файлы.
при одинаковых именах добавлять цифру RRR_1(1).jpg, желательно контроль длины имени файла (<260 символов).
Опустевшие папки удалять.
Заранее спасибо.
Foreigner
13-08-2011, 15:48
Arsenik77, возможны ошибки, не тестировал:
@echo off
setlocal
pushd "c:\Down" || goto:eof
for /f "tokens=*" %%i in ('dir /b /s /a-d') do call:1 "%%~dpi." "%%~nxi" "%%i"
popd
goto:eof
:1
set "file=%~nx1_%~2"
:2
set /a cnt+=1
if exist "%file%" set "file=%~nx1_%~n2(%cnt%)%~x2" && goto:2
move %3 "%file%"
2>nul rd %1
set "cnt="
Arsenik77
13-08-2011, 18:38
не удаляет пустые папки если там были другие папки (можно прикрутить это (http://forum.oszone.net/thread-210867.html) )
при одинаковых именах просто заменяет файлы, надо чтоб переименовывал.
Foreigner
13-08-2011, 19:02
Arsenik77,
На счет файлов не знаю, все отрабатывает корректно, по крайней мере на тестовой папке. Для удаления директорий надо исправить:
for /f "tokens=*" %%i in (' "dir /b /s /a-d | sort /r" ') do call:1 "%%~dpi." "%%~nxi" "%%i"
ЗЫ. Разобрался, что значит замещает, у меня все тестовые файлы были одинаковые. Исправил:
@echo off
setlocal
for /f "tokens=*" %%i in (' "dir /b /s /a-d "C:\Down" | sort /r" ') do call:1 "%%~dpi." "%%~nxi" "%%i"
goto:eof
:1
set "file=%~nx1_%~2"
:2
set /a cnt+=1
if exist "C:\Down\%file%" set "file=%~nx1_%~n2(%cnt%)%~x2" && goto:2
move %3 "C:\Down\%file%"
2>nul rd %1
set "cnt="
Arsenik77
13-08-2011, 19:17
на счет файлов понял, а что исправить (непонятно)??
Foreigner
13-08-2011, 19:21
Arsenik77,
Просто скопируй второй вариант и замени все "C:\Down" если у тебя другой путь.
Arsenik77
13-08-2011, 19:33
Папки и подпапки все равно не удаляет.
При каждом новом запуске к имени добавляется "down" это не хорошо (батник будет запускаться каждый час), надо чтоб батник отрабатывал только папки и подпапки в "Down", а сами файлы находящиеся в корне ("Down") не трогал.
Этот хорошо удаляет все папки, но только я не знаю куда его прикрутить.
@echo off
:again
for /f "tokens=*" %%i in (' dir /b /s /ad "c:\Down" ') do 2>nul rd /q "%%i" && goto:again
Foreigner
13-08-2011, 19:42
Папки и подпапки все равно не удаляет. »
Не знаю даже, у меня все удаляет. Чтобы не трогать файлы в самой C:\Down:
@echo off
setlocal
for /d %%i in ("C:\down\*") do (
for /f "tokens=*" %%j in (' "dir /b /s /a-d "%%i" | sort /r" ') do call:1 "%%~dpj." "%%~nxj" "%%j"
)
popd
goto:eof
:1
set "file=%~nx1_%~2"
:2
set /a cnt+=1
if exist "C:\Down\%file%" set "file=%~nx1_%~n2(%cnt%)%~x2" && goto:2
move %3 "C:\Down\%file%"
2>nul rd "%~dpnx1"
set "cnt="
Arsenik77
13-08-2011, 19:47
С переименовкой все хорошо!
Скажите куда прописать.
:again
for /f "tokens=*" %%i in (' dir /b /s /ad "c:\Down" ') do 2>nul rd /q "%%i" && goto:again
Foreigner
13-08-2011, 19:59
Arsenik77,
Просто скопируй второй вариант, полностью. Я там исправил переименовку, и удаление пустых папок. Если не получится, то будем думать, как решить проблему. Твой пример с удалением не очень подходит.
PS. Посмотрел, вообще можно и так. Замени 2>nul rd "%~dpnx1" На эти две строчки (:again)
Arsenik77
13-08-2011, 20:07
Не удаляет папки.
Foreigner
13-08-2011, 20:14
Замени 2>nul rd "%~dpnx1" На эти две строчки (:again) »
Но будет работать чуть дольше. Не знаю почему не удаляются папки. На Win-7 все отрабатывается как надо.
Arsenik77
13-08-2011, 20:28
странно у меня тоже win7 , даже заменив эти две строчки, он не удаляет папки, какие-то непонятные глюки.
Ладно, считаю задачу решенной! Спасибо!!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.