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

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

Ответить
Настройки темы
PowerShell - вытянуть информацию из html полученного через curl

Старожил


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

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


Изменения
Автор: Griboed0ff
Дата: 17-09-2021
Доброго всем времени суток. Есть задача, которую надо решить именно через bat. Через curl скачивается страничка и из нее нужно извлечь нужную информацию, на скрине отмечено, что нужно вытянуть мак-адрес, номер телефона, модель и серийный номер. На данный момент батник уже может: узнает какая подсеть на компе, потом сканит диапазон из этой подсети, потом curl скачивает странички с айпишки с данными. А вот далее нужно, чтобы батник мог как-то вытянуть данные со странички и плюс как-то мог сам подставить все странички, которые есть в папке.

Отправлено: 08:26, 16-04-2020

 

Аватара для YuS_2

Crazy


Contributor


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

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


Griboed0ff, это утечка памяти... видимо из-за runspace -ов. Ничего не поделаешь, только ждать исправлений...

-------
scio me nihil scire. Ѫ


Отправлено: 15:48, 10-05-2020 | #131



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

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


Старожил


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

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


Цитата YuS_2:
Ничего не поделаешь »
раз срипт отрабатывает маленькие списки, может как то выдавать скрипту части списка, например, по пять строк? не существует никакой команды, которая бы очищала бы память?

Отправлено: 16:01, 10-05-2020 | #132


Старожил


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

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


нормально обрабатывает список по 50 строк, больше начинаются приколы.

Отправлено: 19:05, 10-05-2020 | #133


Ветеран


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

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


Цитата Griboed0ff:
может как то выдавать скрипту части списка, например, по пять строк? »
А как хранится этот список?

Отправлено: 19:26, 10-05-2020 | #134


Старожил


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

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


Цитата Foreigner:
А как хранится этот список? »
файлик txt, внутри список столбиком
Код: Выделить весь код
10.10.10.
10.10.20.
10.10.30.
у меня почти 3000 подсетей\строк в файлике, по 50 строк обрабатывает на ура.

Отправлено: 19:36, 10-05-2020 | #135


Ветеран


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

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


Цитата Griboed0ff:
файлик txt, внутри список столбиком »
Если речь про pwsh, тогда попробуйте запускать так:
Код: Выделить весь код
PS > get-content file.txt -readcount 50 | foreach -parallel { script.ps1 $_ } -throttlelimit $(сколько потоков)
Если powershell:
Код: Выделить весь код
PS > get-content file.txt -readcount 50 | foreach { script.ps1 $_ }
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:50, 10-05-2020 | #136


Старожил


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

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


Цитата Foreigner:
Если речь про pwsh, тогда попробуйте запускать так: »
я так понимаю надо тогда в самом скрипте убирать лишнее?
Скрытый текст
Код: Выделить весь код
param (
	#[parameter(Mandatory=$true)]
	[string]$outfile = 'D:\PowerShell\готовые\общийпошик7.csv',
	$enc1 = 65001,
	$enc2 = 28591,
	[int[]]$SelectTable = 1
)

#---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------
# Установка дополнительного модуля PowerHTML, для независимого парсинга HTML
# Может потребоваться ручное подтверждение установки. 
if (!(get-module -list powerhtml)) {
	write-verbose "Installing PowerHTML module for the current user..."
	install-module powerhtml #-scope currentuser
}
#-----------------------------------------------------------------------------------------

function convert ($from, $to){
	begin{
		$fenc = [text.encoding]::getencoding($from)
		$tenc = [text.encoding]::getencoding($to)
	}
	process{
		$a = $tenc.getbytes($_)
		$fenc.getstring($a)
	}
}
[net.servicepointmanager]::securityprotocol = 0
[array]$arr  = gc 'D:\PowerShell\готовые\ip1.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort

if ([string]::isnullorempty($selecttable)){
	$number = 0
} else {$number = $selecttable}
$ips|% -parallel {
	if (test-connection $_ -count 1 -q -timeout 1){
		try {
            $ip = $_
			$a = (iwr $_).content
			$content = if ($a -match [char]208){
				if ($a -match 'windows-1251'){
					$enc1,$enc2 = 1251,1252
					$a|convert $enc1 $enc2
				} else {$a|convert $using:enc1 $using:enc2}
			} else {$a}
			$html = [net.webutility]::htmldecode($content)|convertfrom-html
			[array]$tables = $html.selectnodes('//table')
			# Исключение вложенных таблиц:
			$tables = $tables|?{$_.selectnodes('.//table') -eq $null}
			$tbl = $tables[$using:number]|%{$n=0}{
				$tr = $_.selectnodes('.//tr')
				$headers = @()
				if ($headers = $_.selectnodes('.//th')){
					$headers = ($headers|select -exp innertext).trim()
				} else {
					$headers = 1..([linq.parallelenumerable]::max(
						[linq.parallelenumerable]::asparallel(
							($tr|%{$_.selectnodes('.//td').count})
						)
					))|%{"H$_"}
				}
				$rowind = ,1 * $headers.count
				$tr|?{$_.selectnodes('.//td') -ne $null}|%{
					$row = $_.selectnodes('.//td')|%{
						$attr = $_.attributes
						if ($attr){
							$rowspan = ($attr|? name -eq 'rowspan').value
							$colspan = ($attr|? name -eq 'colspan').value
						}
						[pscustomobject]@{
							'InnerText' = $_.innertext
							'RowSpan' = if($rowspan){[int]$rowspan} else {1}
							'ColSpan' = if($colspan){[int]$colspan} else {1}
						}
					}
					$str = [ordered]@{}
					$k=0
					foreach ($item in $row) {
						if ($rowind[$k] -gt 1){
							while ($rowind[$k] -gt 1) {
								$str[$headers[$k]] = $null
								$rowind[$k] -= 1
								$k++
							}
						}
						if (($colspan = $item.colspan) -gt 1) {
							$str[$headers[$k]] = if ($item.innertext) {
								$item.innertext.trim()
							} else {$null}
							if ($item.rowspan -gt 1) {$rowind[$k] = $item.rowspan}
							$k++
							while ($colspan -gt 1) {
								$str[$headers[$k]] = $null
								$colspan -=1
								if ($rowind[$k] -gt 1) {$rowind[$k]-=1}
								$k++
							}
						} else {
							$str[$headers[$k]] = if($item.innertext){
								$item.innertext.trim()
							} else {$null}
							if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
							$k++
						}
					}
					[pscustomobject]$str
				}
			}
			$parr1 = $tbl.h1
			if ($tbl.h2 -ne $null) {$parr2 = $tbl.h2} else {$parr2 = $tbl.h3}
			[pscustomobject]@{
				'IP'				= $_
				'MAC-адрес' 		= if ([array]::indexof($parr1,'MAC-адрес') -ne -1) {
										$parr2[([array]::indexof($parr1,'MAC-адрес'))]
									  } else {$parr2[([array]::indexof($parr1,'MAC Address'))]}
				'Номер телефона'	= if ([array]::indexof($parr1,'Номер телефона') -ne -1) {
										$parr2[([array]::indexof($parr1,'Номер телефона'))]
									  } elseif ([array]::indexof($parr1,'Номер телефона 1') -ne -1) {
									  	$parr2[([array]::indexof($parr1,'Номер телефона 1'))]
									  } else {
									  	$parr2[([array]::indexof($parr1,'Phone DN'))]
									  }
				'Серийный номер'	= if ([array]::indexof($parr1,'Серийный номер') -ne -1) {
										$parr2[([array]::indexof($parr1,'Серийный номер'))]
									  } else {$parr2[([array]::indexof($parr1,'Serial Number'))]}
				'Номер модели'		= if ([array]::indexof($parr1,'Номер модели') -ne -1) {
										$parr2[([array]::indexof($parr1,'Номер модели'))]
									  } else {$parr2[([array]::indexof($parr1,'Model Number'))]}
			}
		} catch {
			write-host Ошибка: $ip - $_ -for red
		}
	}
} -throttlelimit 1000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
Скрытый текст
Код: Выделить весь код
 get-content D:\PowerShell\готовые\ip1.txt -readcount 50 | foreach -parallel { D:\PowerShell\готовые\phone_p7.ps1 $_ } -throttlelimit $(1000)
Скрытый текст
Код: Выделить весь код
Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
     |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.96.34.
     | 10.96.37. 10.96.39. 10.96.49. 10.96.50. 10.96.169. 10.96.155. 10.96.146. 10.96.195. 10.96.54.
     | 10.96.106. 10.96.184. 10.96.117. 10.96.162. 10.96.158. 10.96.124. 10.96.125. 10.96.55. 10.96.130.
     | 10.96.131. 10.96.137. 10.96.138. 10.96.140. 10.96.196. 10.96.193. 10.96.120. 10.96.126. 10.96.51.
     | 10.96.166. 10.96.30. 10.97.5. 10.96.70. 10.97.218. 10.97.60. 10.97.137. 10.97.16. 10.97.219.
     | 10.97.209. 10.96.48. 10.96.53. 10.96.148. 10.98.17. 10.96.80. 10.96.175. 10.96.173. 10.96.176.
     | 10.96.151. 10.96.44. 10.96.167. 10.96.160'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
     |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.96.165.
     | 10.96.197. 10.96.180. 10.96.199. 10.96.200. 10.96.179. 10.96.181. 10.96.31. 10.97.7. 10.96.121.
     | 10.96.202. 10.96.203. 10.96.161. 10.97.6. 10.97.10. 10.97.12. 10.96.189. 10.97.58. 10.97.14. 10.97.15.
     | 10.97.27. 10.97.34. 10.97.74. 10.97.35. 10.97.30. 10.97.26. 10.97.81. 10.97.24. 10.97.77. 10.96.60.
     | 10.97.83. 10.96.154. 10.96.72. 10.96.73. 10.96.65. 10.96.94. 10.97.23. 10.97.212. 10.97.211. 10.97.82.
     | 10.98.11. 10.97.47. 10.97.49. 10.96.89. 10.97.101. 10.97.71. 10.97.120. 10.97.55. 10.96.118. 10.97.57'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
     |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.97.18.
     | 10.97.67. 10.97.119. 10.97.22. 10.97.28. 10.97.68. 10.97.32. 10.97.33. 10.97.61. 10.97.43. 10.97.69.
     | 10.97.62. 10.97.72. 10.97.75. 10.97.79. 10.97.100. 10.97.109. 10.97.110. 10.96.111. 10.97.106.
     | 10.96.164. 10.97.111. 10.97.114. 10.96.32. 10.97.115. 10.97.118. 10.98.59. 10.97.54. 10.98.61.
     | 10.98.64. 10.98.70. 10.98.68. 10.98.69. 10.98.73. 10.98.67. 10.98.71. 10.98.77. 10.98.75. 10.98.106.
     | 10.98.78. 10.98.81. 10.98.79. 10.98.80. 10.98.85. 10.98.92. 10.98.90. 10.98.87. 10.98.86. 10.98.83.
     | 10.98.82'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
     |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.98.84.
     | 10.98.88. 10.98.89. 10.98.95. 10.98.97. 10.98.91. 10.98.93. 10.98.98. 10.98.94. 10.98.96. 10.98.102.
     | 10.98.104. 10.98.99. 10.98.101. 10.98.100. 10.98.103. 10.98.105. 10.98.111. 10.98.112. 10.98.108.
     | 10.98.107. 10.97.170. 10.98.74. 10.98.116. 10.98.115. 10.97.44. 10.98.114. 10.97.227. 10.96.22'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
     |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.208.64.
     | 10.209.236. 10.208.67. 10.208.137. 10.208.134. 10.208.143. 10.208.146. 10.209.14. 10.209.13.
     | 10.209.16. 10.209.30. 10.209.234. 10.209.233. 10.209.209. 10.209.130. 10.209.211. 10.209.241.
     | 10.209.244. 10.209.235. 10.209.242. 10.209.239. 10.209.243. 10.208.36. 10.209.245. 10.209.251.
     | 10.209.246. 10.209.252. 10.208.19. 10.208.26. 10.208.32. 10.208.33. 10.208.46. 10.208.41. 10.97.164.
     | 10.97.201. 10.96.35. 10.96.27. 10.96.133. 10.96.69. 10.96.75. 10.98.29. 10.97.73. 10.98.32. 10.98.33.
     | 10.98.57. 10.97.196. 10.96.42. 10.96.108. 10.97.139. 10.96.183'

Последний раз редактировалось Griboed0ff, 10-05-2020 в 21:07.


Отправлено: 20:18, 10-05-2020 | #137


Ветеран


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

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


Так, сразу и не разберешься. Применительно к скрипту, надо как-то менять саму конструкцию. Попробуйте заменить:

Код: Выделить весь код
$ips|% -parallel {.....
на
Код: Выделить весь код
$x = 0

for ($i =0; $i -le ($ips.count - 1); $i += 20)     # по 20 адресов
{
    $ips[$x..$i] | foreach -parallel { <здесь весь оставшийся код> } -throttlelimit 1000 | export-csv $outfile -notype -enc utf-8 -d ';' -append
    $x = $i + 1
}
Т.е. завернуть foreach ("%") в for
Проверить, понятное дело, не могу. И мне кажется, что лучше выбрать throttellimit другим, 1000, имхо, большой перебор. сколько ядер, умноженное на кол-во потоков одного ядра.

Ошибся:
Код: Выделить весь код
for ($i =20;....
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:15, 10-05-2020 | #138


Старожил


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

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


Цитата Foreigner:
Т.е. завернуть foreach ("%") в for »
запустил, работает, посмотрим, что насобирает. исправил обе 20 на 50, и throttellimit на 100.

Отправлено: 21:32, 10-05-2020 | #139


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Foreigner:
Если powershell: »
Если powrshell, то там это не нужно... runspace в нем задействовать придется по-другому.

Цитата Foreigner:
Если речь про pwsh »
То именно запуск скрипта лучше не распараллеливать, распареллеливание реализовано уже внутри, тут как раз потребуется последовательное выполнение...

Griboed0ff,
В скрипте, который Вы показываете:
Цитата Griboed0ff:
elimit 1000 »
А в логе ошибок:
Цитата Griboed0ff:
elimit 1000000 »

Так ресурсы, Вы не сэкономите... скушает скрипт их легко и быстро.

-------
scio me nihil scire. Ѫ


Отправлено: 21:37, 10-05-2020 | #140



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как получить информацию, не отображаемую в HTML-коде? Apock Вебмастеру 0 26-12-2015 22:11
Имитация браузера через cURL dmit.medv Вебмастеру 0 28-12-2012 18:02
[решено] Вывести информацию из файла через JS MultiMax Вебмастеру 1 31-05-2011 22:58
[решено] Вытянуть содержание HTML тега с помощью регулярных выражений aesir AutoIt 4 28-08-2009 21:22
Как передать в javascript данные массива, полученного из кода на php vagner_HATE Вебмастеру 1 18-06-2009 13:51




 
Переход