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

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

Ответить
Настройки темы
CMD/BAT - [решено] Поиск меток в файлах и выполнение действий.

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


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

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


Добрый день Товарищи!

Нужна ваша помощь в оптимизации одного процесса.

Есть директория "Source", в эту папку каждый день сохраняются обработанные txt файлы (файлов N количество) с названиями БД для дальнейшей обработки.
-----------------------------------------------
Пример содержимого одного корректного обработанного txt файла:
;_DELETE_Analysers SQC
;_DELETE_REUS
;_DELETE_RTOS
;_DELETE_test
;_DELETE_Water drain
;_DELETE_WELL
Configuration
FLERT
-----------------------------------------------
Есть директория "Recipient", в эту папку вручную (скриптом копирования) переношу автоматически сохраненные и обработанные txt файлы.
Вручную проверяю, потому что в момент запуска скрипта по сбору названий БД, сам SQL сервер может быть недоступен и в файл txt вместо списка БД запишеться ошибка подключения.
Нужно такие файлы пропустить, чтобы они не перезаписали уже ранее скопированные файлы с корректным содержимым.
-----------------------------------------------
Пример содержимого одного txt файла с ошибкой подключения:
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : TCP Provider: No connection could be made because the target machine actively refused it.
.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
-----------------------------------------------
Далее скрипт обработки этих файлов подключается к директории "Recipient", обрабатывает каждый файл, создает каталоги по названиям, делает бэкап и т.д.
Т.е. директория "Recipient" является источником для других скриптов обслуживания.

Вопрос в том, как можно обработать txt файлы по содержимому, например проверять в каждом файле наличие метки "Sqlcmd: Error:" или просто "Sqlcmd:"
-----------------------------------------------
powershell:
Select-String -Path "E:\_Auto_Export_AF_DB_\Scripts\SQL_Check_Healthy\Source\*.txt" -Pattern "Sqlcmd:"
-----------------------------------------------
и пропускать файлы с такой ошибкой, не копировать их в директорию "Recipient", копировать только те файлы, которые не содержать указанной метки.
Чтобы файлы с ошибкой подключения, не перезаписывали в директории "Recipient" файлы ранее скопированные с таким же названием но с корректным содержимым (списком БД).

Например что-то вроде этого:
@echo off
set GLOBAL_PATH=E:\_Auto_Export_AF_DB_\Scripts\SQL_Check_Healthy
set SOURCE_PATH=%GLOBAL_PATH%\Source
set RECIPIENT_PATH=%GLOBAL_PATH%\Recipient
forfiles /P "%SOURCE_PATH%" /M "*.txt" /C "cmd /c powershell -Command (gc @file) -replace 'Sqlcmd:', ';Sqlcmd:' > "%RECIPIENT_PATH%\@fname.@ext""

Но вместо замены текста, сделать например условие:
if @file="Sqlcmd: Error:" или просто "Sqlcmd:" then "пропускать и переходить к проверки следующего файла" else "копировать файл в "Recipient" и переходить к проверки следующего файла".

Надеюсь задачу описал максимально понятно. Буду весьма признателен сообществу единомышленников за помощь!
Всем хорошего дня!

Отправлено: 10:53, 16-06-2022

 

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


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

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


Serguei Kouzmine, спасибо большое за подсказку!

Попробовал, да действительно отрабатывает корректно:

Цитата:
@echo off
set GLOBAL_PATH=E:\_Auto_Export_AF_DB_\Scripts\SQL_Check_Healthy
set SOURCE_PATH=%GLOBAL_PATH%\Source
set RECIPIENT_PATH=%GLOBAL_PATH%\Recipient
set ERROR_PATH=%GLOBAL_PATH%\Error
set "KeyErr=Sqlcmd: Error: ;_DELETE_WELL"

2>nul "Md %ERROR_PATH%"
For %%f In ("%SOURCE_PATH%\*.txt") Do (
>nul findstr "%KeyErr%" "%%f" ||>nul xcopy /Y "%%f" "%RECIPIENT_PATH%\"
If Exist "%%f" (>nul findstr "%KeyErr%" "%%f" &&>nul xcopy /Y "%%f" "%ERROR_PATH%\"))
Exit /B 0
Благодарю всех за помощь и подсказки, все решения пригодились!

Всем хорошего дня и удачи в написании скриптов

Отправлено: 12:51, 28-06-2022 | #11



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

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


Ветеран


Contributor


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

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


xxx_RedDevil_xxx, Мне не нравится Ваш код как по постановке, так и по исполнению.
Цитата xxx_RedDevil_xxx:
Есть директория "Source", в эту папку каждый день сохраняются обработанные txt файлы »
То есть у Вас там копятся уйма файлов, которые Вы все при обработке просматриваете в For. Это затратно. Поэтому Xcopy, как Вы его применили, не вариант: однозначно нужен Move. А если хочется иметь копии всех пришедших файлов - флаг в руки: копируйте всё что пришло в Source в другую папку - тут уж нужен Xcopy /D. И, возможно, лучше их в дальнейшем заархивировать с удалением исходных.
И, по стилю, надежнее делать не, например:
set GLOBAL_PATH=E:\_Auto_Export_AF_DB_\Scripts\SQL_Check_Healthy
а
set "GLOBAL_PATH=E:\_Auto_Export_AF_DB_\Scripts\SQL_Check_Healthy"
это позволит избежать ошибок, если присутствуют конечные незаметные на экране конечные пробелы.
Не очень корректно использованы строки поиска в FindStr, так как в строке поиска "Sqlcmd: Error:" присутствует пробел.
Вот вариант:
Код: Выделить весь код
@Echo Off
cls
	Set "GLOBAL_PATH=Z:\_Auto_Export_AF_DB_\Scripts\SQL_Check_Healthy"
	Set "SOURCE_PATH=%GLOBAL_PATH%\Source"
	Set "RECIPIENT_PATH=%GLOBAL_PATH%\Recipient"
	Set "ERROR_PATH=%GLOBAL_PATH%\Error"
	Set "Backup_PATH=%GLOBAL_PATH%\Backup"
	Set "Mask=*.txt"
	Set KeyErr=/C:"Sqlcmd: Error:" /C:";_DELETE_WELL"

	If Not Exist "%SOURCE_PATH%\" (Echo !!! Folder "%SOURCE_PATH%" not found &Pause &Exit /B 2)
	2>nul (Md "%ERROR_PATH%" &Md "%RECIPIENT_PATH%")
	
	>nul 2>&1 Xcopy /Y /D "%SOURCE_PATH%\%Mask%" "%Backup_PATH%\" 
	For %%f In ("%SOURCE_PATH%\%Mask%") Do (
		>nul FindStr %KeyErr% "%%f" ||>nul Move /Y "%%f" "%RECIPIENT_PATH%\" 
		If Exist "%%f" >nul FindStr %KeyErr% "%%f" &&>nul Move /Y "%%f" "%ERROR_PATH%\" 
	)
pause
Exit /B

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


Последний раз редактировалось megaloman, 28-06-2022 в 15:35.

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

Отправлено: 15:30, 28-06-2022 | #12


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


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

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


megaloman, спасибо огромное за указание на проблемные места!

Меня тоже пробел в маркере не нравился, по остальным моментам проведу анализ существующих реализаций и попробую обыграть ваши советы. В целом скрипт работает как задумывалось.

Спасибо большое за помощь!

Хорошего дня!

Отправлено: 15:47, 29-06-2022 | #13



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] автоматическое выполнение действий Ubiquiti Скриптовые языки администрирования Windows 4 10-12-2015 15:44
Мультимедиа - выполнение действий при изменении цвета экрана dieego Программное обеспечение Windows 1 14-05-2013 11:02
CMD/BAT - Поиск файлов в папке и выполнение действий над ними vlad20 Скриптовые языки администрирования Windows 0 09-02-2012 11:00
Выполнение последовательности действий нажатий кнопок мышки DREDivan AutoIt 3 05-09-2010 19:25
Поиск текста и выполнение действий!!! Giena22 AutoIt 5 23-09-2009 20:21




 
Переход