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

sway38 26-06-2018 11:36 2819526

Добавление имени папки в имя файлов, которые лежат в этой папке
 
Добрый день, нужна помощь. Написал тут не много, а дальше трабл. Как сделать так чтоб при нажатии несколько раз на бат имя папки в файле не дублировалось, а лишь менялось если имя папки изменилось?


Код:

rem функция для добавления имени папки к имени файла
:Recur
for /R %p% %%b in ("*.dwg") do (
for /f "delims=\ tokens=1,2,3,4,5,6" %%A in ('echo %%b') do (rename "%%b" "%%~F %%~nb.dwg")
                                )
for /R %p% %%b in ("*.xlsx") do (
for /f "delims=\ tokens=1,2,3,4,5,6" %%A in ('echo %%b') do (rename "%%b" "%%~F %%~nb.xlsx")
                                )
exit /B


megaloman 26-06-2018 13:01 2819536

sway38, Лучше бы Вы изложили задачу, а не демонстрировали трабл.
У Вас есть путь к папке в переменной %p%
Вы ищете все файлы по маске. В переменной %%b получаете полные пути
К именам исходных файлов впереди прибавляется имя папки шестого уровня вложенности, в том числе и для файлов, расположенных более глубоко, или пробел, если такого уровня вложенности у файла нет.
Смысл задачи в этом случае от меня ускользает

Вопросы:
1. Что, те файлы, которые переименовываются, расположены на самом низком уровне вложенности (у Вас он =6)?
Или надо рассматривать только файлы на 6 уровне вложенности?
2. В именах папок и непереименованных файлов возможны пробелы?

sway38 26-06-2018 15:36 2819549

задача такая. Есть папка с названием (ХХХХ) в ней файлы и папки(имена этих папок роли не играют) с файлами. Нужно добавить имя папки с названием (ХХХХ) к именам файлов внутри этой папки и файлам внутри папок вложенных в эту папку. Сделать так чтобы при нажатии на батник несколько раз имя папки не добавлялось несколько раз к именам файлов, а менялось только если изменилось имя папки с названием (ХХХХ). Проблема в том что количество вложенных папок везде разное, поэтому 6 уровней вложенности. Объяснил как смог... Вот как на картинке, если меняется BTS38-151GUL26, то батник меняет имя его и во всех вложенных файлах, не дублируя!

megaloman 26-06-2018 17:41 2819565

Код:

@Echo Off
Set "BoxIn=Z:\Box_Arc\xxxx"
Set "Mask="*.dwg" "*.xlsx""

For /R "%BoxIn%" %%f In (%Mask%) Do Call :DirFile "%BoxIn%" "%%f" "%%~nxf"
GoTo :Eof

:DirFile
        For /F "tokens=1,2 delims=#" %%i IN (%3) DO (
                If "%%j"=="" Ren %2 "%~nx1#%~3" &&Exit /B 0
                If /I "%%i#"=="%~nx1#" Exit /B 0
                If /I Not "%%i#"=="%~nx1#"  Ren %2 "%~nx1#%%j" &&Exit /B 0
        )
Exit /B 1


alpap 26-06-2018 17:54 2819567

sway38
допустим вот так
значит к именам всех файлов вглубь меняющей имя папки "papkaA" (на данном этапе) будет добавлено имя этой папки через знак нижнего подчеркивания (пример: было "file1.txt" стало "papkaA_file1.txt"). Этот знак вынес в переменную на случай, если он уже присутствует в именах файлов, то использовать его нельзя и надо заменить на другой допустимый в именах, например: "-"
Код:

@echo off
set "sh=_"
call :# "papkaA"
pause& exit

:#
 setlocal enabledelayedexpansion
  if exist "%~1" for /f "delims=" %%f in ('dir /a-d/b/s "%~1"') do set "nf=%%f"& echo "%%f"|>nul find "%sh%" && ren "%%f" "%~1%sh%!nf:*%sh%=!" || ren "%%f" "%~1%sh%%%~nxf"
 endlocal
exit /b

т.е. после запуска можете поменять имя основной папки на "papkaB" и запустить повторно, у всех файлов (а они примут вид: "papkaA_file1.txt" после первого запуска) имя изменится на: "papkaB_file1.txt"
(кодировка у меня везде 866 и не забываем про "_", перед первым запуском его не должно быть в именах файлов)

sway38 26-06-2018 18:10 2819569

megaloman, Почему то при добавлении имени папки к имени файла получается Имяпапки#Имяфайла. А можно сделать так чтобы не нужно было заходить в батник и менять путь ручками, а просто кинул батник в папку с файлами которые нужно исправить и он сам брал имя папки в которой лежит?

sway38 26-06-2018 18:31 2819571

alpap, не фунциклирует

alpap 26-06-2018 18:42 2819572

Цитата:

Цитата sway38
кинул батник в папку с файлами »

Код:

@echo off
set "sh=_"
set "d=%~dp0"

setlocal enabledelayedexpansion
 for %%a in ("%d:~0,-1%.") do set "np=%%~nxa"
 for /f "delims=" %%f in ('dir /a-d/b/s "."^|find /v "%~f0"') do set "nf=%%f"& echo "%%f"|>nul find "%sh%" && ren "%%f" "%np%%sh%!nf:*%sh%=!" || ren "%%f" "%np%%sh%%%~nxf"
endlocal
exit

Цитата:

Цитата sway38
не фунциклирует »

чем докажете, как запускаете, где, потому что я могу доказать работоспособность своего кода, если надо.

alpap 26-06-2018 18:58 2819577

вот папка "papka0" с файлами и bat, помещенному в папку
Файл 153068
после 1го запуска
Файл 153069
изменил имя папки на "papkaA"
Файл 153070
запуск уже в этой папке
Файл 153071

sway38 26-06-2018 19:05 2819578

хмм ну по юзерски))) создал .txt внутри папки где переименовываются файлы, открыл через notepad++, вставил код, 866, save .bat. двойной клик. И ничего не изменилось. Можно прописать для каких типов файлов в папке нужно переименование? .dwg, .xlsx

https://c.radikal.ru/c18/1806/ee/1f6db040fc7b.jpg

megaloman 26-06-2018 19:14 2819582

sway38,
Цитата:

Цитата sway38
Почему то при добавлении имени папки к имени файла получается Имяпапки#Имяфайла. А можно сделать так чтобы не нужно было заходить в батник и менять путь ручками, а просто кинул батник в папку с файлами которые нужно исправить и он сам брал имя папки в которой лежит? »

Пожалуйста.
Код:

@Echo Off
rem Set "BoxIn=Z:\Box_Arc\xxxx"

Set "BoxIn=%~dp0"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"

Set "Mask="*.dwg" "*.xlsx""

For /R "%BoxIn%" %%f In (%Mask%) Do Call :DirFile "%BoxIn%" "%%f" "%%~nxf"
GoTo :Eof

:DirFile
        For /F "tokens=1* delims=#" %%i IN (%3) DO (
                If "%%j"=="" Ren %2 "%~nx1#%~3" &&Exit /B 0
                If /I "%%i#"=="%~nx1#" Exit /B 0
                If /I Not "%%i#"=="%~nx1#"  Ren %2 "%~nx1#%%j" &&Exit /B 0
        )
Exit /B 1

Я решил, что пробел - слишком часто встречается в имени и определить, добавлено ли к имени файла имя папки вряд ли представляется возможным, если имя папки прибавлять через пробел. Поэтому поставил #.
Слегка подправил цикл для надёжности.

sway38 26-06-2018 19:45 2819587

Цитата:

Цитата megaloman
Я решил, что пробел - слишком часто встречается в имени и определить, добавлено ли к имени файла имя папки вряд ли представляется возможным, если имя папки прибавлять через пробел. Поэтому поставил #.
Слегка подправил цикл для надёжности. »

В имени папки не будет пробелов, а вот имя файла должно начинаться с пробела Итоговый вид должен быть Имяпапки - Имя, где " - Имяфайла". # можно его убрать совсем как то из имени файла?

megaloman 26-06-2018 22:01 2819597

Цитата:

Цитата megaloman
2. В именах папок и непереименованных файлов возможны пробелы? »

Например: тра ля ля.dwg
тра это имя папки, или кусок имени непереименованного файла?
Надо через пробел - извольте. Криво отработает пробел в имени файла - я не виноват
Код:

@Echo Off
Set "Delim= "

Set "BoxIn=%~dp0"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"

Set "Mask="*.dwg" "*.xlsx""

For /R "%BoxIn%" %%f In (%Mask%) Do Call :DirFile "%BoxIn%" "%%f" "%%~nxf"
GoTo :Eof

:DirFile
        For /F "tokens=1* delims=%Delim%" %%i IN (%3) DO (
                If "%%j"=="" Ren %2 "%~nx1%Delim%%~3" &&Exit /B 0
                If /I "%%i%Delim%"=="%~nx1%Delim%" Exit /B 0
                If /I Not "%%i%Delim%"=="%~nx1%Delim%"  Ren %2 "%~nx1%Delim%%%j" &&Exit /B 0
        )
Exit /B 1


alpap 26-06-2018 23:00 2819606

Цитата:

Цитата sway38
Можно прописать для каких типов файлов в папке нужно переименование? .dwg, .xlsx »

да
Код:

@echo off
set "sh=-"
set "d=%~dp0"

setlocal enabledelayedexpansion
 for %%a in ("%d:~0,-1%.") do set "np=%%~nxa"
 for /f "delims=" %%f in ('dir /a-d/b/s "*.xlsx" "*.dwg"^|find /v "%~f0"') do set "nf=%%f"& echo "%%f"|>nul find "%sh%" && ren "%%f" "%np%%sh%!nf:*%sh%=!" || ren "%%f" "%np%%sh%%%~nxf"
endlocal
exit


sway38 27-06-2018 04:49 2819632

Цитата:

Цитата megaloman
Надо через пробел - извольте. Криво отработает пробел в имени файла - я не виноват »

Вот то что надо! Спасибо

sway38 27-06-2018 05:09 2819633

А можно еще в этот батник одну функцию дописать?
Нужно чтобы в папке где лежит батник он находил файл ***** - Параметры.xlsx узнавал его путь и вставлял его в первую строку файла config.cfg, лежащего здесь же в папке.
https://b.radikal.ru/b25/1806/5f/560e3771913e.jpg


Время: 21:07.

Время: 21:07.
© OSzone.net 2001-