PDA

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


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