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

Ответить
 • Просмотры: 1
Аватара пользователя
Griboed0ff

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Griboed0ff »

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

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Griboed0ff »

Цитата YuS_2:



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




раз срипт отрабатывает маленькие списки, может как то выдавать скрипту части списка, например, по пять строк? не существует никакой команды, которая бы очищала бы память?
Аватара пользователя
YuS_2

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение YuS_2 »

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

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Griboed0ff »

Цитата Griboed0ff:



может как то выдавать скрипту части списка, например, по пять строк?
PowerShell - вытянуть информацию из html полученного через curl




А как хранится этот список?
Аватара пользователя
Griboed0ff

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Griboed0ff »

Цитата Foreigner:



А как хранится этот список?
PowerShell - вытянуть информацию из html полученного через curl




файлик txt, внутри список столбиком

Код:

Код: Выделить всё

10.10.10.
10.10.20.
10.10.30.

у меня почти 3000 подсетей\строк в файлике, по 50 строк обрабатывает на ура.
Аватара пользователя
Griboed0ff

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Griboed0ff »

Цитата Griboed0ff:



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




Если речь про pwsh, тогда попробуйте запускать так:



Код:

Код: Выделить всё

PS > get-content file.txt -readcount 50 | foreach -parallel { script.ps1 $_ } -throttlelimit $(сколько потоков)

Если powershell:



Код:

Код: Выделить всё

PS > get-content file.txt -readcount 50 | foreach { script.ps1 $_ }
Аватара пользователя
Foreigner

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Foreigner »

Цитата Foreigner:



Если речь про pwsh, тогда попробуйте запускать так:
PowerShell - вытянуть информацию из html полученного через curl




я так понимаю надо тогда в самом скрипте убирать лишнее?


Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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








Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

 get-content D:\PowerShell\готовые\ip1.txt -readcount 50 | foreach -parallel { D:\PowerShell\готовые\phone_p7.ps1 $_ } -throttlelimit $(1000)








Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Griboed0ff »

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





Код:

Код: Выделить всё

$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;....
Аватара пользователя
Foreigner

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Foreigner »

Цитата Foreigner:



Т.е. завернуть foreach ("%") в for
PowerShell - вытянуть информацию из html полученного через curl




запустил, работает, посмотрим, что насобирает. исправил обе 20 на 50, и throttellimit на 100.
Аватара пользователя
Griboed0ff

Re: PowerShell - вытянуть информацию из html полученного через curl

Сообщение Griboed0ff »

Цитата Foreigner:



Если powershell:
PowerShell - вытянуть информацию из html полученного через curl




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




Цитата Foreigner:



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




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



Griboed0ff,

В скрипте, который Вы показываете:


Цитата Griboed0ff:



elimit 1000
PowerShell - вытянуть информацию из html полученного через curl




А в логе ошибок:


Цитата Griboed0ff:



elimit 1000000
PowerShell - вытянуть информацию из html полученного через curl




Изображение

Так ресурсы, Вы не сэкономите... скушает скрипт их легко и быстро. Изображение
Ответить

Вернуться в «Скриптовые языки администрирования Windows»