Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.59/17: Рейтинг темы: голосов - 17, средняя оценка - 4.59
Artyom52
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 98
1

Для каждой папки добавить её имя ко всем именам файлов в ней

20.01.2014, 23:21. Просмотров 3208. Ответов 4
Метки нет (Все метки)

Всем привет.
Подскажите, пожалуйста, как мне решить теперь следующую проблему.
В папке, в которой лежит батник (условно папка А) имеются папки B,C,D
Нужно во все файлы папки В добавить имя папки В. Во все файлы в папке С добавить имя папки С.
Нарисовал такой цикл:
Bash
1
2
3
4
5
6
7
8
9
chcp 1251>nul
rem Переименование файлов внутри папок
for /d %%a in ("*") do  (
set put="%%~fa"
 
    for /R %put% %%b in ("*.pdf") do (
        rename "%%b" "%%~nb %%~na.pdf")
                        )
pause
Если в папке А только одна вложенная папка, код с успехом справляется с задачей.
Если больше, то ко всем pdf'кам приписывается BCD, то есть строка, получившаяся объединением всех имен папок. Вроде по логике вещей у меня в переменной a хранится путь и в каждом цикле я заново запрашиваю сокращенное имя папки.
Почему так происходит? Где я ошибся?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2014, 23:21
Ответы с готовыми решениями:

Как получить имя папки? Как узнать имена файлов, которые в ней есть?
Добрый вечер. Такой вопрос. Как получить имя папки? Как узнать имена файлов,которые в ней есть, и...

Добавить суффикс к именам файлов
Добрый день. Нужно добавить суффикс в название файлов в папке( .jpg). Нашел как добавить в...

Добавить к именам файлов пути к этим файлам
Всем привет. Вечно я с какими то глупостями пристаю к вам было /system: drwxr-xr-x 18 0 ...

Если над главной диагональю минимальные элементы столбцов, то добавить всем элементам над ней среднее под ней
Дана действительная матрица размерности (n x n) Если на главной диагонали стоят минимальные...

Как получить имя папки, если знаешь путь к ней?
Здравствуйте, Подскажите как получить имя папки, зная путь к ней. Вот что я пытаюсь сделать: ...

4
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
20.01.2014, 23:55 2
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

Во-первых, актуальное значение переменной put не будет подставлено в строку 6, т.к. было присвоено внутри этого же блока цикла. Потребуется использовать отложенное раскрытие переменной.

Во-вторых, даже если Вы используете его, или решите напрямую подставить переменную цикла в For /R "%%a" - он его все равно посчитает как отложенное выполнение и не воспримет в роле опции для цикла.

Выход использовать другой вариант ключа, либо раскрывать переменную в подпрограмме:

Bash
1
2
3
4
5
6
7
8
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
for /d %%a in (*) do call :Recur "%%a"
pause
 
:Recur
for /R "%~1" %%b in (*.pdf) do echo ren "%%b" "%%~nb %~1%~xb"
0
Artyom52
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 98
21.01.2014, 19:16  [ТС] 3
Dragokas, благодарю. Но вообще не заработало (если это полный код).

Добавлено через 18 минут
Кодировку прописал 1251, так что проблема не в этом.

Добавлено через 1 час 59 минут
Мой следующий вариант:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
chcp 1251>nul
SetLocal EnableExtensions EnableDelayedExpansion
 
chcp 1251>nul
rem Переименование файлов внутри папок
for /d %%a in ("*") do  (
set p="%%~fa"
     for /R %p% %%b in ("*.pdf") do (
     for /f "delims=\ tokens=1,2,3,4,5,6" %%A in ('echo %%b') do (rename "%%b" "%%~nb %%~F.pdf")
                        )
        )
pause
exit
Теперь в имя файла добавляется имя папки столько раз, сколько папок требуется обработать. По предыдущему примеру, все файлы в папке B стали "name BBB.pdf", в С - "name ССС.pdf"
Ради эксперимента создал еще одну папку Е.
Теперь все файлы называются в папке B "name BBВB.pdf", в С - "name СССС.pdf"
0
Artyom52
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 98
22.01.2014, 20:42  [ТС] 4
Мой итоговый рабочий код
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
rem Добавление имени папки в имя файлов в папках
for /d %%a in ("*") do  (
set p="%%~fa"
Call :Recur %p%
                        )
 
 
rem функция для добавления имени папки к имени файла
:Recur
for /R %p% %%b in ("*.pdf") do (
for /f "delims=\ tokens=1,2,3,4,5,6" %%A in ('echo %%b') do (rename "%%b" "%%~nb %%~F.pdf")
                                )
exit /B
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
22.01.2014, 21:30 5
Artyom52, может мой код не сработал потому, что Вы не убрали ключевое слово echo.
А во всем остальном Ваш код в точности его повторяет с кучей лишних при том небезопасных элементов.
0
22.01.2014, 21:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2014, 21:30

Добавить папки для быстрого копирования и перемещения файлов. Linux Mint 13 Maya
Linux Mint 13 Cinnamon "Maya". Здравствуйте. Подскажите, возможно ли добавить сюда: для...

Открытие папки и файлов в ней
В общем такая ситуаци: С помощью CommandDialog указываю нужный файл. Но для работы программы нужно...

Выбор папки и всех файлов в ней
Доброго времени суток, столкнулся с проблемой, есть код => private void button3_Click(object...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru