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

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

Ответить
Настройки темы
PowerShell - [решено] Скрипт по сбору строк из множества файлов в один.

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


Сообщения: 4
Благодарности: 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

 

Аватара для Elven

Ветеран


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

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


Как-то непонятно куда куски вывода подевались и каким боком они структурировались. А еще, по секрету говорю, никому не признавайтесь, скоро Iska отпишется в этой ветке и потребует исходные файлы. Обычно их удобнее расковыривать, чем возиться с уже полученным выводом.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:36, 27-01-2017 | #2



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

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


Ветеран


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

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


Ну, вот, мною уже и детей пугают .

Load980, нужны а) образцы исходных файлов (упакуйте в архив, выложите на RGhost или Яндекс.Диск) и б) внятное описание техзадания — что нужно получить.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:35, 27-01-2017 | #3


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


Сообщения: 4
Благодарности: 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
Благодарности: 8086

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


Цитата Load980:
из множества файлов с одинаковым расширением, »
И с каким именно?! .cfg?

Цитата Load980:
осуществить поиск строк содержащих информацию $text = ‘(wireless.1.ssid=|netconf.3.autoip.status|devname)’ - например для этих, »
Найти строки, содержащие wireless.1.ssid или netconf.3.autoip.status или devname? devname встречается кучу раз. Что делать?

Пишите простым человеческим языком, в ТЗ не надо ничего изобретать.

Цитата Load980:
сделать выборку по совпадению вывести строки в текстовый файл по шаблону:
<Имя файла_1>
<Строка_1>
<Строка_2>
<Строка_3>
<Строка_4> »
Опять странности. Что за Строка_1, Строка_2, Строка_3, Строка_4?!

Откуда возьмётся Строка_4, если в шаблоне поиска три значения для поиска? Какое-то значение встретится несколько раз? Возможно. Но, опять же, Вы рассчитываете, что выборка окажется в строго заданном порядке. А ну как окажется, что — нет?

Потому изложите данное условие в виде: сначала идёт имя файла, в котором осуществляется выборка, затем строка с netconf.3.autoip.status, затем строка с wireless.1.ssid, затем строка с… и т.д.

P.S. Вам конечный результат/вид выходного файла для каких целей потребен? Что с ним планируете делать?
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:20, 27-01-2017 | #5


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


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

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


Я Вас понял.
Теперь человеческим языком )
Есть куча сгруженных конфигов с оборудования, была поставлена задача собрать со всех конфигов значения параметров в данном случае это строки после знака "=" их значения, они собственно и нужны,
если возможно вывести только их то будет вообще отлично.


<Имя файла> из которого собираем
netconf.3.ip=
aaa.1.ssid=
radio.1.chanbw=
radio.1.freq=
users.1.name=
wireless.1.ssid=

Цитата Iska:
P.S. Вам конечный результат/вид выходного файла для каких целей потребен? »
Нужно вывести собрать данные в таблицу Excel

http://rgho.st/7yZ6Kmmyw

Последний раз редактировалось Load980, 27-01-2017 в 15:56.

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

Отправлено: 15:49, 27-01-2017 | #6


Ветеран


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

Профиль | Отправить 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
'=============================================================================

Вызывайте в виде:
Код: Выделить весь код
>"Result.csv" cscript.exe //nologo "Путь\Скрипт.vbs" "Путь к искомой папке"
Вот, что получилось у меня на основе предложенных Вами файлов:
Скрытый текст
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:41, 27-01-2017 | #7


Ветеран


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

Профиль | Отправить 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


Ветеран


Contributor


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

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


Вложения
Тип файла: rar Бланк20170129.rar
(11.6 Kb, 15 просмотров)

Если надо конечный результат в Excel, вот решение, которое макросом собирает данные непосредственно в Excel в прикреплённом Excel-файле (заархивировано в Бланк20170129.rar).
Как пользоваться: 1. Открыть xls-файл (это пустой бланк для дальнейшей работы), открыть макрос для изменения, прописать путь, откуда берутся файлы и, по образцу, имена параметров и в какие ячейки они должны попадать. Сохранить на будущее.
2. Запустить макрос на выполнение, он создаст из бланка новую книгу, куда будут сведены данные из cfg-файлов
Так как Вами поставлена задача недостаточно четко, в дальнейшем можно переделать бланк в том виде, какой Вам требуется - макрос построен достаточно гибко, чтобы указать нужные данные и их местоположение.
Что касается начальной постановки, вот решение CMD
Цитата Load980:
<Имя файла_1>
<Строка_1>
<Строка_2>
<Строка_3>
<Строка_4>
<Имя файла_2>
<Строка_1>
<Строка_2>
<Строка_3>
<Строка_4> »
Код: Выделить весь код
@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
Благодарности: 4

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


Решено ! Большое спасибо megaloman, то что нужно. Решение от Iska, тоже работает, осталось только допилить под себя и можно собирать данные.
Спасибо еще раз!
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:16, 30-01-2017 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход