PowerShell - вытянуть информацию из html полученного через curl
-
Griboed0ff
Re: PowerShell - вытянуть информацию из html полученного через curl
Griboed0ff, это утечка памяти... видимо из-за runspace -ов. Ничего не поделаешь, только ждать исправлений...
-
Griboed0ff
Re: PowerShell - вытянуть информацию из html полученного через curl
Цитата YuS_2:
Ничего не поделаешь
раз срипт отрабатывает маленькие списки, может как то выдавать скрипту части списка, например, по пять строк? не существует никакой команды, которая бы очищала бы память?
Ничего не поделаешь
PowerShell - вытянуть информацию из html полученного через curl
раз срипт отрабатывает маленькие списки, может как то выдавать скрипту части списка, например, по пять строк? не существует никакой команды, которая бы очищала бы память?
-
YuS_2
Re: PowerShell - вытянуть информацию из html полученного через curl
нормально обрабатывает список по 50 строк, больше начинаются приколы.
-
Griboed0ff
Re: PowerShell - вытянуть информацию из html полученного через curl
Цитата Griboed0ff:
может как то выдавать скрипту части списка, например, по пять строк?
А как хранится этот список?
может как то выдавать скрипту части списка, например, по пять строк?
PowerShell - вытянуть информацию из html полученного через curl
А как хранится этот список?
-
Griboed0ff
Re: PowerShell - вытянуть информацию из html полученного через curl
Цитата Foreigner:
А как хранится этот список?
файлик txt, внутри список столбиком
Код:
у меня почти 3000 подсетей\строк в файлике, по 50 строк обрабатывает на ура.
А как хранится этот список?
PowerShell - вытянуть информацию из html полученного через curl
файлик txt, внутри список столбиком
Код:
Код: Выделить всё
10.10.10.
10.10.20.
10.10.30.у меня почти 3000 подсетей\строк в файлике, по 50 строк обрабатывает на ура.
-
Griboed0ff
Re: PowerShell - вытянуть информацию из html полученного через curl
Цитата Griboed0ff:
файлик txt, внутри список столбиком
Если речь про pwsh, тогда попробуйте запускать так:
Код:
Если powershell:
Код:
файлик 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:
Если речь про pwsh, тогда попробуйте запускать так:
я так понимаю надо тогда в самом скрипте убирать лишнее?
Скрытый текст
[spoiler]Код: [/spoiler]
Скрытый текст
[spoiler]Код: [/spoiler]
Скрытый текст
[spoiler]Код: [/spoiler]
Если речь про 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
Так, сразу и не разберешься. Применительно к скрипту, надо как-то менять саму конструкцию. Попробуйте заменить:
Код:
на
Код:
Т.е. завернуть foreach ("%") в for
Проверить, понятное дело, не могу. И мне кажется, что лучше выбрать throttellimit другим, 1000, имхо, большой перебор. сколько ядер, умноженное на кол-во потоков одного ядра.
Ошибся:
Код:
Код:
Код: Выделить всё
$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:
Т.е. завернуть foreach ("%") в for
запустил, работает, посмотрим, что насобирает. исправил обе 20 на 50, и throttellimit на 100.
Т.е. завернуть foreach ("%") в for
PowerShell - вытянуть информацию из html полученного через curl
запустил, работает, посмотрим, что насобирает. исправил обе 20 на 50, и throttellimit на 100.
-
Griboed0ff
Re: PowerShell - вытянуть информацию из html полученного через curl
Цитата Foreigner:
Если powershell:
Если powrshell, то там это не нужно... runspace в нем задействовать придется по-другому.
Цитата Foreigner:
Если речь про pwsh
То именно запуск скрипта лучше не распараллеливать, распареллеливание реализовано уже внутри, тут как раз потребуется последовательное выполнение...
Griboed0ff,
В скрипте, который Вы показываете:
Цитата Griboed0ff:
elimit 1000
А в логе ошибок:
Цитата Griboed0ff:
elimit 1000000
Так ресурсы, Вы не сэкономите... скушает скрипт их легко и быстро.
Если powershell:
PowerShell - вытянуть информацию из html полученного через curl
Если powrshell, то там это не нужно... runspace в нем задействовать придется по-другому.
Цитата Foreigner:
Если речь про pwsh
PowerShell - вытянуть информацию из html полученного через curl
То именно запуск скрипта лучше не распараллеливать, распареллеливание реализовано уже внутри, тут как раз потребуется последовательное выполнение...
Griboed0ff,
В скрипте, который Вы показываете:
Цитата Griboed0ff:
elimit 1000
PowerShell - вытянуть информацию из html полученного через curl
А в логе ошибок:
Цитата Griboed0ff:
elimit 1000000
PowerShell - вытянуть информацию из html полученного через curl
Так ресурсы, Вы не сэкономите... скушает скрипт их легко и быстро.
