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

Arsenik77 13-08-2011 14:22 1731041

Добавление к имени файла имя папки
 
Нужен батник который добавляет к имени файла имя папки где он находится
например: есть c:\Down\RRR\1.jpg надо c:\Down\RRR_1.jpg
Папка Down основная, в неё записываются разные папки и файлы.
при одинаковых именах добавлять цифру RRR_1(1).jpg, желательно контроль длины имени файла (<260 символов).
Опустевшие папки удалять.
Заранее спасибо.

Foreigner 13-08-2011 15:48 1731083

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 1731157

не удаляет пустые папки если там были другие папки (можно прикрутить это )
при одинаковых именах просто заменяет файлы, надо чтоб переименовывал.

Foreigner 13-08-2011 19:02 1731169

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 1731181

на счет файлов понял, а что исправить (непонятно)??

Foreigner 13-08-2011 19:21 1731184

Arsenik77,
Просто скопируй второй вариант и замени все "C:\Down" если у тебя другой путь.

Arsenik77 13-08-2011 19:33 1731189

Папки и подпапки все равно не удаляет.
При каждом новом запуске к имени добавляется "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 1731194

Цитата:

Цитата Arsenik77
Папки и подпапки все равно не удаляет. »

Не знаю даже, у меня все удаляет. Чтобы не трогать файлы в самой 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 1731196

С переименовкой все хорошо!
Скажите куда прописать.
Код:

: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 1731201

Arsenik77,
Просто скопируй второй вариант, полностью. Я там исправил переименовку, и удаление пустых папок. Если не получится, то будем думать, как решить проблему. Твой пример с удалением не очень подходит.

PS. Посмотрел, вообще можно и так. Замени 2>nul rd "%~dpnx1" На эти две строчки (:again)

Arsenik77 13-08-2011 20:07 1731202

Не удаляет папки.

Foreigner 13-08-2011 20:14 1731206

Цитата:

Цитата Foreigner
Замени 2>nul rd "%~dpnx1" На эти две строчки (:again) »

Но будет работать чуть дольше. Не знаю почему не удаляются папки. На Win-7 все отрабатывается как надо.

Arsenik77 13-08-2011 20:28 1731210

странно у меня тоже win7 , даже заменив эти две строчки, он не удаляет папки, какие-то непонятные глюки.
Ладно, считаю задачу решенной! Спасибо!!


Время: 01:53.

Время: 01:53.
© OSzone.net 2001-