View previous topic :: View next topic |
Author |
Message |
MVV
![](images/avatars/7418103424d805f0e7526c.gif)
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Fri Jan 27, 2017 22:05 Post subject: |
|
|
Невозможно разрешить удаленное имя - вполне естественная ошибка, странно только, что с первым скриптом она не возникает на некоторых ссылках...
А если задать 1 поток (2, 3 потока) во втором скрипте, тоже результаты нестабильные?
Возможно, в консоли показываются только 300 строк из-за того, что остальные уже не вмещаются в консольный буфер. Попробуй запустить батник в консоли с выводом в файл:
Code: | UrlFilter.bat > output.txt |
_________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Hjkma
Joined: 18 Apr 2015 Posts: 178
|
(Separately) Posted: Fri Jan 27, 2017 22:10 Post subject: |
|
|
MVV
C 3 потоком скрипт возвращает количество ссылок, максимально ближе к общему числу работающих ссылок. С 2 и 1 потоком потестирую.
Про батник в консоли поподробнее, пожалуйста. Сразу после окончания процесса нужно вставить эту строку в конслоь?
Upd. С 2 потоком вернуло уже все работающие ссылки. Еще раз запустил - вернуло то же самое количество ссылок. Но скорость в целом не айс - на 1925 ссылок скрипт тратит в среднем 17 минут. Где-то 1,8 ссылок за одну секунду получается. С одним потоком результат думаю будет тоже самим - как с первым скриптом.
P.S. Можно ли внести в работе скрипта вот эту заплатку?
Quote: | сделать так, чтобы в конце работы скрипт еще раз обрабатывал ссылки, которые возвращают приведенный выше код ошибки. С одним потоком и увеличенным таймаутом. |
Просто при 2 потоках скорость в 1,8 ссылок за одну секунду для меня является медленной. При 10 потоков скорость получается 5 ссылок за одну секунду, что уже приемлемо. Правда теряется часть работающих ссылок. В таком случае пусть скрипт в конце работы еще раз обработает те ссылки, которые возвращают коды "Невозможно разрешить удаленное имя" и "Время ожидания операции истекло". С одним потоком и увеличенным таймаутом. Тогда проблема, думаю, будет решена. Это возможно так сделать? |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
MVV
![](images/avatars/7418103424d805f0e7526c.gif)
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Hjkma
Joined: 18 Apr 2015 Posts: 178
|
(Separately) Posted: Sat Jan 28, 2017 00:07 Post subject: |
|
|
MVV
Из тех 300 строк что я видел ссылки эти располагались хаотично. Впрочем нужно еще посмотреть полный файл лога.
Quote: | Упомянутую мной команду надо запускать вместо запуска процесса кнопкой, это будет запуск того же самого процесса, но с выводом текста в файл. |
Сам батник находится по адресе
Quote: | e:\Users\Vova\Google Drive\Анализ папок и прочее\скрипты\validate web-adress.bat |
Я просто зашел в папку "скрипты", где лежит этот батник, вызвал командную строку, в консоли уже был путь этой папки, я к ней дописал название батника и "> output.txt". Полностью эта строка выглядит так
Quote: | e:\Users\Vova\Google Drive\Анализ папок и прочее\скрипты\validate web-adress.bat > output.txt |
Но при нажатии на Enter ничего не происходит, только создается еще одна строка пути этой папки и курсор перемещается к ней.
Я что-то не так сделал?
З.Ы. Уже разобрался, оказалось надо заключать в кавычки название батника, процесс пошел, потом отпишусь.
Upd. Итак вот что выяснилось. Запускал батник с 10 потоками и таймаутом на 10000. Основная причина отсева работающих ссылок - превышено время ожидания операции. Раньше когда когда таймаут был больше, были коды "не удалось разрешить удаленное имя". И такие ошибки разбросаны хаотически по всему списку, то есть не в какой-то момент, а на протяжении всего работы скрипта. Дальше еще раз запущу, но с увеличенным таймаутом. И посмотрю будут ли те же ссылки отбрасываться и поменяются ли коды ошибок.
Upd2. Запустил батник с 10 потоками и таймаутом на 100000. Результаты теперь такие. Всего есть две коды ошибок у работающих ссылок - "Невозможно соединиться с удаленным сервером" и "Невозможно разрешить удаленное имя". В этот раз ссылки, которых скрипт отбросил, совсем другие, чем те который в предыдущий раз были отброшены. И расположенны эти ссылки хаотически по всему списку ссылок. И они нормально открываются в браузере.
Last edited by Hjkma on Sat Jan 28, 2017 01:52; edited 1 time in total |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
MVV
![](images/avatars/7418103424d805f0e7526c.gif)
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Sat Jan 28, 2017 01:34 Post subject: |
|
|
В общем, наворотил я многопроходность, число проходов и таймауты регулируются массивом $passTimeouts (сколько там таймаутов, столько и проходов).
Code: | @echo off
set "ARG_0=%~dpnx0"
powershell.exe -STA -NoProfile "iex (([IO.File]::ReadAllText($Env:ARG_0)) -replace '^(.*\n)*?.*<::::>.*\n', '')" & goto :EOF
Add-Type -Assembly System.Windows.Forms;
$workerCount = 8;
$passTimeouts = @(2000, 5000, 10000, 20000);
function testUrls($defs, $timeout, $workerCount = 1) {
$job = @{
queue = [Collections.Queue]::Synchronized((New-Object Collections.Queue (, $defs)));
timeout = $timeout;
};
$script = {
$job = $args[0];
while (1) {
try { $def = $job.queue.Dequeue(); } catch { return; }
try {
$req = [Net.WebRequest]::Create($def.url);
$req.Method = 'HEAD';
$req.Timeout = $job.timeout;
$rsp = $req.GetResponse();
$def.err = '';
}
catch {
$e = $_.Exception;
while ($e -and $e -isnot [Net.WebException]) { $e = $e.InnerException; }
$rsp = $e.Response;
$def.err = $e.Message;
}
if ($rsp) {
$def.code = [int]$rsp.StatusCode;
$rsp.Close();
}
}
};
if ($workerCount -gt 1) {
$workers = @((1 .. $workerCount) | % { $w = [PowerShell]::Create().AddScript($script).AddArgument($job); @{ ps = $w; r = $w.BeginInvoke() } });
$workers | % { $_.ps.EndInvoke($_.r) };
}
else {
. $script $job;
}
}
$defs = @([Windows.Forms.Clipboard]::GetText() -split '\r?\n' | ? { $_ -match '^\w+://' } | % { @{ url = $_; } });
$leftDefs = $defs;
$startTime = [DateTime]::Now;
Write-Host "Validating $($defs.Length) urls using $workerCount workers...`n";
$testDef = @{ url = 'http://google.com' };
testUrls @($testDef) 10000 1;
if (!$testDef.code) {
Write-Host "Oops, self-check failed!";
$host.SetShouldExit(1);
return;
}
for ($step = 0; $step -lt $passTimeouts.Length -and $leftDefs.Length; ++$step) {
$passStartTime = [DateTime]::Now;
Write-Host "Executing pass #$step using timeout $($passTimeouts[$step])...";
testUrls $leftDefs $passTimeouts[$step] $workerCount;
$leftDefs = @($leftDefs | ? { !$_.code; if ($_.code) { Write-Host "$($_.url): $($_.code)" } });
Write-Host "Pass #$step done in $([int]([DateTime]::Now - $passStartTime).TotalSeconds) seconds, $($leftDefs.Length) urls left.";
'';
}
if ($leftDefs) {
Write-Host 'Unresolved urls:';
$leftDefs | % { Write-Host "$($_.url): $($_.err)" };
'';
}
$goodUrls = @($defs | ? { $_.code -ge 200 -and $_.code -le 399 } | % { $_.url });
Write-Host "Validation done in $([int]([DateTime]::Now - $startTime).TotalSeconds) seconds.";
if ([Windows.Forms.MessageBox]::Show("Click OK to copy $($goodUrls.Length) good urls.", 'Url Validator', 1) -eq 1) {
[Windows.Forms.Clipboard]::SetText(($goodUrls -join "`n") + "`n");
} |
Каждая ссылка тестируется, пока не будет получен код статуса (который при таймаутах и ошибках DNS недоступен). После каждого прохода в консоль выводятся коды ссылок, полученные на этом проходе, и в конце выводятся ссылки без кодов статуса. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Last edited by MVV on Sat Jan 28, 2017 17:45; edited 1 time in total |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Hjkma
Joined: 18 Apr 2015 Posts: 178
|
(Separately) Posted: Sat Jan 28, 2017 02:05 Post subject: |
|
|
Отлично, все работающие ссылки успешно скопировались. Большое вам спасибо за скрипт! |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|