|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поиск меток в файлах и выполнение действий. |
|
|
CMD/BAT - [решено] Поиск меток в файлах и выполнение действий.
|
Новый участник Сообщения: 10 |
Профиль | Отправить 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 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Powershell:
$source = "D:\temp\SQL\Source" $recipient = "D:\temp\SQL\Recipient" dir "$source\*.txt" |% { if (-not ((gc $_) -match 'Sqlcmd:')) { cp $_ "$recipient" -WhatIf } } Цитата xxx_RedDevil_xxx:
Invoke-Command -ComputerName SRV-SQL1 -Command {Invoke-Sqlcmd -ServerInstance "localhost" -Database "users_db" -Query "SELECT users_column FROM users_table"} |
|
------- Последний раз редактировалось DJ Mogarych, 16-06-2022 в 13:21. Отправлено: 13:12, 16-06-2022 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать DJ Mogarych, спасибо вам огромное!
Вариант со скриптом Powershell отработал, удалил -WhatIf и все заработало. Файлы с маской были проигнорированы, а файлы с корректным содержимым перенеслись в конечную директорию. До адаптирую дальше под свои нужны! Спасибо что уделили время для решения этой задачи. Хорошего вам дня! |
Отправлено: 15:53, 16-06-2022 | #3 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Доброго дня!
Адаптировал и проверил работу данного скрипта в рабочей среде, все работает отлично. Вопрос, подскажите пожалуйста как можно обыграть этот скрипт через CMD? В основном скрипте уже есть объявленный набор переменных, например: @echo off set GLOBAL_PATH=E:\_Auto_Export_AF_DB_ set SELECT_PATH=E:\_Auto_Export_AF_DB_\Scripts\SQL_Select_AF_DB set BACKUP_LIST_PATH=E:\_Auto_Export_AF_DB_\AF_DB_List Сейчас выполняется ряд условий, затем переход к строке которая из cmd запускает скрипт powershell: cmd: powershell "%BACKUP_LIST_PATH%\SQL_Check_Healthy_and_Copy_to_Input.ps1" SQL_Check_Healthy_and_Copy_to_Input.ps1: $source = "E:\_Auto_Export_AF_DB_\AF_DB_List\_SQL_AF_DB_List_All_Rep_" $recipient = "E:\_Auto_Export_AF_DB_\AF_DB_List" dir "$source\*.txt" |% {if (-not ((gc $_) -match 'Sqlcmd:')) {cp $_ "$recipient"}} И после проверки и копирования файлов cmd идет дальше. Можно ли обыграть powershell скрипт в среде cmd, чтобы отдельно не объявлять переменные в powershell, а использовать уже объявленные в cmd? Например: forfiles /P "%SELECT_PATH%\SQL_AF_DB_List_All" /M "*.txt" /C "cmd /c powershell -Command (gc @file) -replace '^_DELETE_', ';_DELETE_' > "%SELECT_PATH%\SQL_AF_DB_List_All_Rep\@fname.@ext"" Только вместо где $source в powershell это "%BACKUP_LIST_PATH%\_SQL_AF_DB_List_All_Rep_\" в cmd, а $recipient в powershell это "%BACKUP_LIST_PATH%" в cmd. Если реализация данной задачи возможна без powershell, подскажите пожалуйста как можно реализовать скрипт средствами cmd. Заранее благодарю! Хорошего дня! |
Отправлено: 14:10, 22-06-2022 | #4 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Вместо скрещивания ежа с ужом лучше скрипт переделать целиком под Powershell
|
|
------- Отправлено: 14:48, 22-06-2022 | #5 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать DJ Mogarych, понимаю что полностью переделать на одной платформе с cmd на powershell было бы правильнее, но в данном случае, скрипт основной довольной большой и выполняет большое кол-во задач. На текущий момент тратить время на переделывание существующего скрипта трудоемко и нецелесообразно, никто не оценит. Возможно если в будущем заняться будет больше нечем)) Поэтому приходиться дописывать небольшие доработки и скрещивать мух с котлетами и ежей с ужами))
Если можете подсказать по поводу реализации задумки на cmd, буду весьма признателен. |
Отправлено: 15:29, 22-06-2022 | #6 |
Старожил Сообщения: 193
|
Профиль | Отправить PM | Цитировать Цитата xxx_RedDevil_xxx:
|
|
Отправлено: 16:15, 22-06-2022 | #7 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать xxx_RedDevil_xxx,
Цитата xxx_RedDevil_xxx:
@Echo Off Set "Source=Z:\sqlwork\Source\*.txt" Set "Recipient=Z:\sqlwork\Recipient" Set "Error=Z:\sqlwork\Error" Set "KeyErr=Sqlcmd: Error:" 2>nul "Md %Error%" For %%f In ("%Source%") Do ( >nul Find "%KeyErr%" "%%f" ||>nul Move /Y "%%f" "%Recipient%\ If Exist "%%f" (>nul Find "%KeyErr%" "%%f" &&>nul Move /Y "%%f" "%Error%\") ) Exit /B 0 |
|
------- Отправлено: 07:49, 24-06-2022 | #8 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать megaloman, спасибо вам огромное, адаптировал ваш код под свои нужды, работает отлично!
Цитата:
Добавил только копирование файлов из Recipient в Backup, чтобы был бэкап последних рабочих файлов перед манипуляциями и изменил move на xcopy, пусть файлы остаются в Source. Подскажите пожалуйста, можно ли делать перечисления якорей в переменной "KeyErr", если будет нужно в будущем по нескольким маскам проверять файлы? Например: set "KeyErr="Sqlcmd: Error:",";_DELETE_WELL"" |
|
Отправлено: 11:17, 27-06-2022 | #9 |
Старожил Сообщения: 245
|
Профиль | Отправить PM | Цитировать замените find.exe на findstr.exe
Use spaces to separate multiple search strings unless the argument is prefixed with /C. For example, 'FINDSTR "hello there" x.y' searches for "hello" or "there" in file x.y. |
Последний раз редактировалось Serguei Kouzmine, 27-06-2022 в 18:31. Отправлено: 18:13, 27-06-2022 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|