|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Скрипт по сбору строк из множества файлов в один. |
|
PowerShell - [решено] Скрипт по сбору строк из множества файлов в один.
|
Новый участник Сообщения: 4 |
Профиль | Отправить PM | Цитировать Доброго всем!, выпала мне рутинная задача собрать из выгруженных файлов информацию в один,
вот что смог собрать $LineNumber = ‘(wireless.1.ssid=|netconf.3.autoip.status)’ $text = $LineNumber Get-ChildItem -Path “c:\1\” -Include *.cfg -Exclude "!*" -Recurse | select-string -Pattern $text -Encoding "Default" -Context 0,10 | foreach {@($_.FileName), @($_.LineNumber), @($_.Line)}> out.txt Вроде работает, но есть проблема файл не структурирован результат: -------------------------------------------------- 10.12.3.20-XM-6875412AA694.cfg 78 netconf.3.autoip.status=disabled 10.12.3.20-XM-6875412AA694.cfg 250 wireless.1.ssid=_WIFI 10.12.3.22-XM-6872514677E6.cfg 76 netconf.3.autoip.status=disabled 10.12.3.22-XM-6872514677E6.cfg 248 wireless.1.ssid=_WIFI -------------------------------------------------- Хотелось бы видеть отдельным блоком для каждого файла. как то так: 10.12.3.20-XM-6875412AA694.cfg netconf.3.autoip.status=disabled wireless.1.ssid=_WIFI 10.12.3.22-XM-6872514677E6.cfg netconf.3.autoip.status=disabled wireless.1.ssid=_WIFI Спасибо. |
|
Отправлено: 10:20, 27-01-2017 |
Ветеран Сообщения: 992
|
Профиль | Сайт | Отправить PM | Цитировать Как-то непонятно куда куски вывода подевались и каким боком они структурировались. А еще, по секрету говорю, никому не признавайтесь, скоро Iska отпишется в этой ветке и потребует исходные файлы. Обычно их удобнее расковыривать, чем возиться с уже полученным выводом.
|
Отправлено: 11:36, 27-01-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Ну, вот, мною уже и детей пугают .
Load980, нужны а) образцы исходных файлов (упакуйте в архив, выложите на RGhost или Яндекс.Диск) и б) внятное описание техзадания — что нужно получить. |
Отправлено: 13:35, 27-01-2017 | #3 |
Новый участник Сообщения: 4
|
Профиль | Отправить PM | Цитировать Вот пара файлов из которых нужно извлечь информацию
http://rgho.st/6jStXYQYH Тех задание. Сделать выборку строк из множества файлов с одинаковым расширением, осуществить поиск строк содержащих информацию $text = ‘(wireless.1.ssid=|netconf.3.autoip.status|devname)’ - например для этих, сделать выборку по совпадению вывести строки в текстовый файл по шаблону: <Имя файла_1> <Строка_1> <Строка_2> <Строка_3> <Строка_4> <Имя файла_2> <Строка_1> <Строка_2> <Строка_3> <Строка_4> ... |
Последний раз редактировалось Load980, 27-01-2017 в 14:57. Отправлено: 14:50, 27-01-2017 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Load980:
Цитата Load980:
Пишите простым человеческим языком, в ТЗ не надо ничего изобретать. Цитата Load980:
Откуда возьмётся Строка_4, если в шаблоне поиска три значения для поиска? Какое-то значение встретится несколько раз? Возможно. Но, опять же, Вы рассчитываете, что выборка окажется в строго заданном порядке. А ну как окажется, что — нет? Потому изложите данное условие в виде: сначала идёт имя файла, в котором осуществляется выборка, затем строка с netconf.3.autoip.status, затем строка с wireless.1.ssid, затем строка с… и т.д. P.S. Вам конечный результат/вид выходного файла для каких целей потребен? Что с ним планируете делать? |
||||
Отправлено: 15:20, 27-01-2017 | #5 |
Новый участник Сообщения: 4
|
Профиль | Отправить PM | Цитировать Я Вас понял.
Теперь человеческим языком ) Есть куча сгруженных конфигов с оборудования, была поставлена задача собрать со всех конфигов значения параметров в данном случае это строки после знака "=" их значения, они собственно и нужны, если возможно вывести только их то будет вообще отлично. <Имя файла> из которого собираем netconf.3.ip= aaa.1.ssid= radio.1.chanbw= radio.1.freq= users.1.name= wireless.1.ssid= Цитата Iska:
http://rgho.st/7yZ6Kmmyw |
|
Последний раз редактировалось Load980, 27-01-2017 в 15:56. Отправлено: 15:49, 27-01-2017 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Многое непонятно в этой таблице. Где в ней, скажем, имя файла? Или, получается, оно вообще не нужно, несмотря на написанное ранее?! Какое соответствие между заголовками таблицы и перечисленными параметрами для выборки?
Что-то со скрипом идёт у меня PowerShell. Попробуйте на WSH: Скрытый текст
Option Explicit Dim strSourceFolder Dim objFSO Dim dictPatterns Dim dictLine Randomize Timer Set dictPatterns = WScript.CreateObject("Scripting.Dictionary") Set dictLine = WScript.CreateObject("Scripting.Dictionary") With dictPatterns ' Параметр, Заголовок столбца .Add "netconf.3.ip", "IP адрес" .Add "aaa.1.ssid", "bla-bla-bla1" .Add "radio.1.chanbw", "bla-bla-bla2" .Add "radio.1.freq", "Частота" .Add "users.1.name", "bla-bla-bla3" .Add "wireless.1.ssid", "bla-bla-bla4" End With If WScript.Arguments.Count = 1 Then strSourceFolder = WScript.Arguments.Item(0) Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If objFSO.FolderExists(strSourceFolder) Then WScript.StdOut.WriteLine Join(dictPatterns.Items(), ";") ScanSubFolders objFSO.GetFolder(strSourceFolder), "cfg" Else WScript.Echo "Can't find source folder [" & strSourceFolder & "]." WScript.Quit 2 End If Set objFSO = Nothing Else WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>" WScript.Quit 1 End If dictLine.RemoveAll dictPatterns.RemoveAll Set dictLine = Nothing Set dictPatterns = Nothing WScript.Quit 0 '============================================================================= '============================================================================= Sub ScanSubFolders(objFolder, strFileExt) Dim objFile Dim objSubFolder Dim arrContent Dim arrFilteredContent Dim strKey Dim arrKeyValuePair For Each objFile In objFolder.Files If StrComp(objFSO.GetExtensionName(objFile.Name), strFileExt, vbTextCompare) = 0 Then With objFSO.OpenTextFile(objFile.Path) arrContent = Split(.ReadAll(), vbLf) .Close End With For Each strKey In dictPatterns.Keys arrFilteredContent = Filter(arrContent, strKey & "=", True, vbTextCompare) If UBound(arrFilteredContent) >= 0 Then arrKeyValuePair = Split(arrFilteredContent(0), "=") dictLine.Add arrKeyValuePair(0), """" & arrKeyValuePair(1) & """" Else dictLine.Add Rnd(), "" End If Next WScript.StdOut.WriteLine Join(dictLine.Items(), ";") dictLine.RemoveAll End If Next For Each objSubFolder In objFolder.SubFolders ScanSubFolders objSubFolder, strFileExt Next End Sub '============================================================================= Вызывайте в виде: Вот, что получилось у меня на основе предложенных Вами файлов: Скрытый текст
|
Отправлено: 21:41, 27-01-2017 | #7 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать $Path = 'C:\1\' $Out = 'Out.csv' ( $a = @( 'netconf.3.ip' 'aaa.1.status' 'radio.1.chanbw' 'radio.1.freq' 'users.1.name' 'wireless.1.ssid' ) ) | foreach { $Title += ('"'+$_+'";') } $Title | Out-File $Out Get-ChildItem -Path $Path -Include '*.cfg' -Exclude '!*' -Recurse | foreach { $File = $_ $a | foreach { $Pattern = $_ $Content = Get-Content $File $Content | foreach { if ($_ -match "$Pattern=(.*)") { $Line += ('"'+$Matches[1]+'";') } } } $Line | Out-File $Out -Append Clear-Variable Line } |
Отправлено: 07:43, 28-01-2017 | #8 |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать Если надо конечный результат в Excel, вот решение, которое макросом собирает данные непосредственно в Excel в прикреплённом Excel-файле (заархивировано в Бланк20170129.rar).
Как пользоваться: 1. Открыть xls-файл (это пустой бланк для дальнейшей работы), открыть макрос для изменения, прописать путь, откуда берутся файлы и, по образцу, имена параметров и в какие ячейки они должны попадать. Сохранить на будущее.
2. Запустить макрос на выполнение, он создаст из бланка новую книгу, куда будут сведены данные из cfg-файлов Так как Вами поставлена задача недостаточно четко, в дальнейшем можно переделать бланк в том виде, какой Вам требуется - макрос построен достаточно гибко, чтобы указать нужные данные и их местоположение. Что касается начальной постановки, вот решение CMD
Цитата Load980:
@Echo off Set "Mask=Z:\Box_In\*.cfg" Set "OutFile=%~dpnx0.txt" Set /A M=0 Call :MassIn "netconf.3.ip=" Call :MassIn "aaa.1.ssid=" Call :MassIn "radio.1.chanbw=" Call :MassIn "radio.1.freq=" Call :MassIn "users.1.name=" Call :MassIn "wireless.1.ssid=" Del "%OutFile%" 2>nul SetLocal EnableExtensions EnableDelayedExpansion FOR %%f IN ("%Mask%") DO ( FOR /L %%i IN (1,1,%M%) DO Call :MassN Find%%i "%%f" N%%i >>"%OutFile%" Echo %%~nxf FOR /L %%i IN (1,1,%M%) DO Call :OutTxt "%%f" N%%i >>"%OutFile%" Echo ------ ) Start " " NOTEPAD "%OutFile%" GoTo :Eof :MassIn Set /A M+=1 Set "Find%M%=%~1" GoTo :Eof :MassN Set /A %3=0 FOR /F "usebackq delims=[]" %%n IN (`Find /N "%%%~1%%" %2`) DO Set /A %3=%%n-1 2>nul GoTo :Eof :OutTxt If %2 GEQ 1 FOR /F "usebackq delims=" %%s IN (`more %1 +%%%~2%%`) DO >>"%OutFile%" Echo %%s &GoTo :Eof GoTo :Eof |
|
------- Последний раз редактировалось megaloman, 30-01-2017 в 00:43. Отправлено: 17:43, 29-01-2017 | #9 |
Новый участник Сообщения: 4
|
Профиль | Отправить PM | Цитировать Решено ! Большое спасибо megaloman, то что нужно. Решение от Iska, тоже работает, осталось только допилить под себя и можно собирать данные.
Спасибо еще раз! |
Отправлено: 08:16, 30-01-2017 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBS/WSH/JS - [решено] Скрипт по сбору инфы о железе (помогите добавить нужное) | ZeVSalt | Скриптовые языки администрирования Windows | 11 | 28-09-2020 10:53 | |
CMD/BAT - Извлечение информации из множества файлов в один | Борис_Спектор@vk | Скриптовые языки администрирования Windows | 9 | 07-02-2016 21:43 | |
CMD/BAT - [решено] Копирование всех строк из множества файлов одного каталога в один выходной файл | FCSMoff | Скриптовые языки администрирования Windows | 11 | 25-05-2015 14:00 | |
CMD/BAT - [решено] удаление части строк из всех текстовых файлов в папке | icq99999999 | Скриптовые языки администрирования Windows | 4 | 06-11-2013 07:19 | |
CMD/BAT - Скрипт, для чтения нужных строк из txt файла в переменную | mr.R | Скриптовые языки администрирования Windows | 1 | 26-07-2012 12:59 |
|