Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Операция с именами файлов

Ответить
Настройки темы
CMD/BAT - Операция с именами файлов

Новый участник


Сообщения: 25
Благодарности: 0

Профиль | Отправить PM | Цитировать


Приветствие. Есть небольшой bat'ник с инструкциями, работающими с именами файлов стандарта 11, 12, 13, 14, .... Делалось это для унификации обработки файлов последовательно двумя программа:

Код: Выделить весь код
@echp off
for /L %%a in (11,1,99) do (
[операция первой программы]

[операция второй программы]
)
Но если честно уже поднадоело в начале копировать список имён исходных файлов, переименовывать файлы в указанный выше порядок чисел (11, 12, 13, ...) и после обработки файлов переименовывать итоговый результат в их первоначальные имена.

Можно ли как-нибудь в bat'ник это прописать для автоматизации?

Заранее спасибо.

Отправлено: 22:02, 29-11-2018

 

Новый участник


Сообщения: 25
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ещё раз здравствуйте. Это снова я

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

Заранее спасибо!

Отправлено: 10:30, 08-12-2018 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата rider42:
а как будет выглядеть код, если допустим исходных папок с файлами несколько? »
Оформляете основной код в виде процедуры и вызываете эту процедуру столько раз, сколько у Вас есть исходных каталогов, передавая ей потребные параметры, включая очередной исходный каталог.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:56, 08-12-2018 | #22


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@echo off
set "d=C:\papka"
set "ext=txt"
set n=10

for /d /r "%d%" %%a in (*) do (
 setlocal
  pushd "%%a"
   for %%a in (*.%ext%) do set /a n+=1& call :# "%%a" "%%n%%%%~xa"
  popd
 endlocal
)
pause& exit
 
:#
 ren "%~1" "%~2"
 >"%~2" echo Операция с "%~2"
 ren "%~2" "%~1"
exit /b
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:45, 08-12-2018 | #23


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата rider42:
как будет выглядеть код, если допустим исходных папок с файлами несколько »
по уму, пишется скрипт умеющий обрабатывать единственный файл (а лучше - принимающий конвейер), и после уже штатными средствами он выполняется для списка, директории, поддерева каталогов и т.п.

примерно такой скрипт:
Код: Выделить весь код
echo off
set programm1=echo executing first_programm.exe
set programm2=echo evecuting second_programm.exe

set targetdir=%1
set tempdir=%TEMP%\%~n0%RANDOM%
call :safetyExecute mkdir %tempdir%
if ERRORLEVEL 1 exit 1

FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
  call :process "%%~B" %*
)
call :safetyExecute rmdir /S /Q %tempdir%
if ERRORLEVEL 1 exit 3
goto :EOF

:process
set tempfile=%tempdir%\%RANDOM%%~x1
set targetfullname=%targetdir%\%~n1.mkv
call :safetyExecute mklink "%tempfile%" %1
if ERRORLEVEL 1 goto :eof
call :safetyExecute %programm1% /key1 %2 /key2 %tempfile% %targetfullname%
if ERRORLEVEL 1 goto :eof
call :safetyExecute %programm2% --key1 %2 --key2 %tempfile% %targetfullname%
if ERRORLEVEL 1 goto :eof
call :safetyExecute del %tempfile%
goto :eof


:safetyExecute
echo [running] %*
%*
if ERRORLEVEL 1 (
  echo [error %ERORRLEVEL%] %*
  exit 2
) 
goto :EOF
запускать примерно так:
Код: Выделить весь код
dir /s /b c:\dir1 e:\dir2 | videoprocess.bat c:\targetdir
я отказался от переименования в пользу создания символьных ссылок, т.к. в реалистичном workflow исходный файл это или torrent, который после переименования начнёт перекачиваться, или карта памяти из камеры, которая защищена от записи
а hardlink не работают с NAS, FAT и требую админских прав

Последний раз редактировалось Busla, 08-12-2018 в 16:24. Причина: добавил ключи для rmdir + tempdir из имени батника

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:57, 08-12-2018 | #24


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


rider42,
Цитата Iska:
Оформляете основной код в виде процедуры и вызываете эту процедуру столько раз, сколько у Вас есть исходных каталогов, передавая ей потребные параметры, включая очередной исходный каталог. »
как будет выглядеть код, если допустим исходных папок с файлами несколько
Код: Выделить весь код
@Echo Off
cls
chcp 1251 >nul
	Set "LogBat=%~dpnx0.log"
	>"%LogBat%" Echo    %Date% %Time%

	Call :Process "Z:\Download\Video" "Z:\Download\!Vid2CHG" "mp4" "mkv"
	Call :Process "Z:\Box_In\Download\Video" "Z:\Box_In\Download\!Vid2CHG" "mp4" "mkv"
	Call :Process "Z:\Soft_In\Download\Video" "Z:\Soft_In\Download\!Vid2CHG" "mp4" "mkv"
pause
GoTo :Eof

:Process
	Set "BoxIn=%~1"
	Set "BoxOut=%~2"
	Set "ExtIn=%~3"
	Set "ExtOut=%~4"
	
	If Not Exist "%BoxOut%" Md "%BoxOut%"

	Set /A NNN=11

	FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\*.%ExtIn%" /b /a:-d /O:D`) DO (

		>>"%LogBat%" (Echo: &Echo === begin "%BoxIn%\%%f")

		Call :MyMove "%BoxIn%\%%f" "%BoxIn%\%NNN%.%ExtIn%"
		Del "%BoxOut%\%NNN%.%ExtOut%" >nul 2>&1

rem Обработка программами
		Echo "%BoxIn%\%%f"
		Echo "%BoxIn%\%NNN%.%ExtIn%"
		Echo:
		Copy "%BoxIn%\%NNN%.%ExtIn%" "%BoxOut%\%NNN%.%ExtOut%" >nul
rem ---------------------

		Call :MyMove "%BoxIn%\%NNN%.%ExtIn%" "%BoxIn%\%%f"
		Call :MyMove "%BoxOut%\%NNN%.%ExtOut%" "%BoxOut%\%%~nf.%ExtOut%"
	)
GoTo :Eof

:MyMove
		If Not Exist %1 (
			>>"%LogBat%" Echo --- not found %1
			Exit /B 2			
		)

		>>"%LogBat%" 2>&1 Move /Y %1 %2 
		If Exist %2 (
			>>"%LogBat%" Echo +++ success Move /Y %1 %2
		) Else (
			>>"%LogBat%" Echo --- failure Move /Y %1 %2
			>>"%LogBat%" Echo --- failure Move /Y %1 %2
		)
GoTo :Eof

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:45, 08-12-2018 | #25


Новый участник


Сообщения: 25
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: log LF.bat.log
(2.3 Kb, 2 просмотров)

Цитата megaloman:
как будет выглядеть код, если допустим исходных папок с файлами несколько »
Я неверное снова что-то сделал не так, но данный варианту меня не работает.

Суть такова:

В папке "d:\uTorrent\work\(WRKD)\LostFilm\" лежит главный файл, а в папке "d:\uTorrent\work\(WRKD)\LostFilm\aud\" дополнительный. В папке же "d:\uTorrent\work\(WRKD)\" должен оказаться итоговый файл после обработки с именем файла как в "d:\uTorrent\work\(WRKD)\LostFilm\"
Скрытый текст
Код: Выделить весь код
@Echo Off
cls
chcp 1251 >nul
	Set "LogBat=%~dpnx0.log"
	>"%LogBat%" Echo    %Date% %Time%

	Call :Process "d:\uTorrent\work\(WRKD)\LostFilm" "d:\uTorrent\work\(WRKD)" "mkv" "mkv"
	Call :Process "d:\uTorrent\work\(WRKD)\LostFilm\aud\" "d:\uTorrent\work\(WRKD)\LostFilm\Temp1" "mkv" "mkv"
	
pause
GoTo :Eof

:Process
	Set "BoxIn=%~1"
	Set "BoxOut=%~2"
	Set "ExtIn=%~3"
	Set "ExtOut=%~4"
	
	If Not Exist "%BoxOut%" Md "%BoxOut%"

	Set /A NNN=11

	FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\*.%ExtIn%" /b /a:-d /O:D`) DO (

		>>"%LogBat%" (Echo: &Echo === begin "%BoxIn%\%%f")

		Call :MyMove "%BoxIn%\%%f" "%BoxIn%\%NNN%.%ExtIn%"
		Del "%BoxOut%\%NNN%.%ExtOut%" >nul 2>&1

"C:/Soft/!Video/MKVtoolnix-29.0.0\mkvmerge.exe" --ui-language ru --output ^"D:\uTorrent\work\^(WRKD^)\11.mkv^" --language 0:eng --default-track 0:yes --language 1:eng --default-track 1:no --sub-charset 2:UTF-8 --language 2:eng ^"^(^" ^"D:\uTorrent\work\^(WRKD^)\LostFilm\11.mkv^" ^"^)^" --audio-tracks 1 --no-video --language 1:rus --track-name 1:LostFilm --default-track 1:yes --forced-track 1:yes --sync 1:-9250 ^"^(^" ^"D:\uTorrent\work\^(WRKD^)\LostFilm\aud\11.mkv^" ^"^)^" --track-order 0:0,1:1,0:1,0:2

		Call :MyMove "%BoxIn%\%NNN%.%ExtIn%" "%BoxIn%\%%f"
		Call :MyMove "%BoxOut%\%NNN%.%ExtOut%" "%BoxOut%\%%~nf.%ExtOut%"
	)
GoTo :Eof

:MyMove
		If Not Exist %1 (
			>>"%LogBat%" Echo --- not found %1
			Exit /B 2			
		)

		>>"%LogBat%" 2>&1 Move /Y %1 %2 
		If Exist %2 (
			>>"%LogBat%" Echo +++ success Move /Y %1 %2
		) Else (
			>>"%LogBat%" Echo --- failure Move /Y %1 %2
			>>"%LogBat%" Echo --- failure Move /Y %1 %2
		)
GoTo :Eof

Отправлено: 20:52, 08-12-2018 | #26


Новый участник


Сообщения: 25
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Почему у Вас в вызове одинаковые расширения входного и выходного файла? »
В данном случае у всех файлов (исходных и итоговых) расширением является mkv

Последний раз редактировалось rider42, 08-12-2018 в 21:27.


Отправлено: 21:20, 08-12-2018 | #27



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Операция с именами файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Перемещение файлов в папки с аналогичными именами londondron Скриптовые языки администрирования Windows 12 22-03-2017 15:22
Разное - Операция Перемещение файлов kaplyaas Microsoft Windows 10 5 10-12-2016 15:59
CMD/BAT - Создание папок и файлов со с случайными именами. Kirstem Скриптовые языки администрирования Windows 0 26-04-2015 20:06
текстовый файл с именами всех файлов в папке socap AutoIt 19 19-02-2012 16:42
Проблема с русскими именами файлов iml Общий по Linux 7 25-09-2006 12:40




 
Переход