CMD/BAT - [решено] Переместить файлы, содержащие определенное значение, +одноименные к ним.

Ответить
Аватара пользователя
jahvdet

CMD/BAT - [решено] Переместить файлы, содержащие определенное значение, +одноименные к ним.

Сообщение jahvdet »

Трбуется:

1. в папке найти файлы, содержащие одно из нескольких определенных значений формата "TO|1234|" (цифры разные, всего 5 значений)

2. в зависимости от того, какое из значений было найдено - переместить файл в другую папку, папка назначения зависит от найденного значения.

3. вместе с найденным файлом переместить одноименный с ним, но с расширением .info (у найденного в п.1 файла может быть любое расширение, кроме .info).

4. в папке поиска вести лог, в который добавлять имена всех перемещенных файлов.



Желательно в 2х вариантах - для запуска с того же компьютера, и для запуска по сети (доступ к шаре по логину\паролю).

Спасибо!
Аватара пользователя
jahvdet

Re: CMD/BAT - [решено] Переместить файлы, содержащие определенное значение, +одноименные к ним.

Сообщение jahvdet »

p.s. небольшое замечание, возможно полезное для оптимизации - в самом файле искомые значения находятся в начале 3й строки, но строка после них продолжается.
Аватара пользователя
jahvdet

Re: CMD/BAT - [решено] Переместить файлы, содержащие определенное значение, +одноименные к ним.

Сообщение jahvdet »

jahvdet, 1-4 примерно так:



Код:

Код: Выделить всё

@echo off
set SRC=c:\SRC
set DST=1234-d:\DST\1;5678-d:\DST\2;9012-d:\DST\3;3456-d:\DST\4;7890-d:\DST\5
PUSHD "%SRC%"& SETLOCAL EnableDelayedExpansion
for %%i in (%DST%) do for /f "tokens=1* delims=-" %%a in ("%%i") do set "$_%%a=%%b"& set $r=!$r! /c:"TO|%%a|"
for /f "tokens=1-3 delims=:|" %%a in ('findstr %$r% *') do if /i not "%%~xa"==".info" (
  xcopy /y "%%a" "!$_%%c!\" >nul 2>&1 && (
    del /f "%%a" >nul 2>&1
    echo %%a --^^^> !$_%%c!\
    xcopy /y "%%~na.info" "!$_%%c!\" >nul 2>&1 && (
      del /f "%%~na.info" >nul 2>&1
      echo %%~na.info --^^^> !$_%%c!\
    )
  ) >>"%~n0.log"
)
ENDLOCAL& POPD

SRC: каталог-источник

DST: назначения:

---------------------

1234 - d:\DST\1

5678 - d:\DST\2

9012 - d:\DST\3

3456 - d:\DST\4

7890 - d:\DST\5

---------------------



P.S. по поводу сети требуется уточнение: почему именно "удаленный запуск", а не локальная работа с общими ресурсами типа \\SERVER\SHARE\DIR ?
Аватара пользователя
jahvdet

Re: CMD/BAT - [решено] Переместить файлы, содержащие определенное значение, +одноименные к ним.

Сообщение jahvdet »

Т.к. время поджимало, пришлось самому засесть и покапаться Изображение взял за основу пару решений похожих задач, может местами коряво и не слишком изящно, но вот что получилось:







Код:

Код: Выделить всё

@echo off
cls
set bad=C:\BAD\%date%
set sort=C:\SORT
set log=%bad%\Offline_logs_%date%.txt
rem ----------------------------- Тест на доступ к исходной папке
if not exist "%bad%\*.*" (
   echo Directory is not exist: %bad%
   GoTo :Eof
)
rem ----------------------------- Если папки назначения нет - создать, не получается - выйти.
if not exist "%sort%\*.*" (mkdir %sort%  || goto :eof)
rem ----------------------------- Вызов поиска поочередно для каждого значения
Call :FindData 1234
Call :FindData 5678
Call :FindData 9012
Call :FindData 3456
Call :FindData 7890
GoTo :Eof
:FindData
rem ----------------------------- Если нет расширенной папки назначения (с кодом значения) - создать, не получается - выйти.
if not exist "%sort%\%1\*.*" (mkdir %sort%\%1 || goto :eof)
rem ----------------------------- Для каждого файла в папке вызываем процедуру поиска в нем заданного значения
FOR %%i IN ("%bad%\*.*") DO Call :SearchInFile %%i %1
GoTo :eof
rem ----------------------------- Поиск заданного значения, передаваемого во втором параметре, в файле, передаваемом в первом параметре
rem ----------------------------- Если находим - перемещаем файл и связанный с ним INFO
:SearchInFile
If /I %~x1==.INFO GoTo :eof Else (
	rem echo Searching %2 in %1
	For /F "eol=Z skip=2 delims=| tokens=1,2" %%j in (%1) do (
	if /I %%j == TO (if %%k==%2 (
		echo Find! %%k in %~nx1
		If NOT EXIST "%~dpn1.INFO" ((Echo [%TIME%] [%2] Ошибка! Для файла %1 не найден соответстующий файл .INFO >> %log%)&(GoTo :Eof)) else (
		copy /Y "%1" "%sort%\%2"
		If NOT Exist "%sort%\%2\%~nx1" (Echo [%TIME%] [%2] Ошибка! Не удалось скопировать файл %1 >> %log%) Else (
			Echo [%TIME%] [%2] %1 успешно скопирован в папку  %sort%\%2 >> %log%
			del "%1" /Q
			If EXIST "%1" (Echo [%TIME%] [%2] Предупреждение! Не удалось удалить файл %1 >> %log%) else (Echo [%TIME%] [%2] %1 успешно удален >> %log%)
		)
		copy /Y "%~dpn1.INFO" "%sort%\%2"
		If NOT Exist "%sort%\%2\%~n1.INFO" (Echo [%TIME%] [%2] Ошибка! Не удалось скопировать %~dpn1.INFO >> %log%) Else (
			Echo [%TIME%] [%2] %~dpn1.INFO успешно скопирован в папку  %sort%\%2 >> %log%
			del "%~dpn1.INFO" /Q
			If EXIST "%~dpn1.INFO" (Echo [%TIME%] [%2] Предупреждение! Не удалось удалить файл %~dpn1.INFO >> %log%) else (Echo [%TIME%] [%2] %~dpn1.INFO успешно удален >> %log%)
		)
		)
	)
	)
	)
)

p.s. после уточнения задания, второй вариант с работой по сети не актуален.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»