2013-01-08 1 views
2

Это оказалось намного сложнее, чем я думал (и, вероятно, это должно быть).Проблемы с использованием Powershell/curl для проверки HTTP-заголовков

Я пробовал Cygwin + curl, но это не удается запустить (Cygwin никогда не может найти curl.exe, но я сделал проверку пакета, и он там).

Я пробовал завиток для Windows, используя командную строку, и он работает. Но у меня есть довольно много URL-адресов, чтобы проверять и делать их индивидуально, просто неэффективно. Я не могу понять, как сказать curl, через подсказку cmd, использовать файл (так как нет «xargs»), как упомянуто here.

Я также пытался использовать PowerShell, но это также проблематично. Когда я пытаюсь следовать вариант 1 here

Я получаю сообщение об ошибке при попытке запуска $xHTTP.open("GET",$url,$false):

Исключение вызова «открыто» с «3» аргумент (ы): «Неизвестная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL)) «

Также с PowerShell я не знаю, как заставить его использовать файл, содержащий URL-адреса. Мои знания PS очень ограничены (как в несуществующих).

Что было бы неплохо здесь, чтобы выяснить, как получить командную строку/curl, чтобы использовать файл, но я не могу понять это.

ответ

8

Существует более прямой способ сделать это с помощью PowerShell V3:

PS> Get-Content .\urls.txt 
http://www.cnn.com 
http://www.msn.com 

PS> Get-Content urls.txt | Foreach { Invoke-WebRequest -Uri $_ -Method HEAD } 

StatusCode  : 200 
StatusDescription : OK 
Content   : 
RawContent  : HTTP/1.1 200 OK 
        Vary: Accept-Encoding 
        Connection: Keep-Alive 
        Cache-Control: max-age=60, private 
        Content-Type: text/html 
        Date: Tue, 08 Jan 2013 20:21:46 GMT 
        Expires: Tue, 08 Jan 2013 20:22:46 GMT... 
Forms    : {} 
Headers   : {[Vary, Accept-Encoding], [Connection, Keep-Alive], [Cache-Control, max-age=60, private], 
        [Content-Type, text/html]...} 
... 

Для обработки 404 используют попробовать/поймать, например:

PS> Get-Content urls.txt | 
     Foreach {try {Invoke-WebRequest -Uri $_ -Method HEAD} catch { "Oops - $_"}} 

Чтобы переадресовать в файл, это работает me:

PS> Get-Content urls.txt | 
     Foreach {try {Invoke-WebRequest -Uri $_ -Method HEAD} catch { "Oops - $_"}} > 
     $home\Desktop\foo.txt 
+0

Пара вопросов об этом (но для большинства деталей это именно то, что я искал). Есть ли способ изящно сделать что-то с 404s? Прямо сейчас, 404 заканчивается исключением. Я пытаюсь вывести его в файл, используя -OutFile. \ Desktop \ results.txt. Он создает файл, но он пуст. Я явно чего-то пропускаю, но не знаю, что. – Kurt

+0

@Braffin См. Обновленный ответ. –

+0

Кейт, спасибо вам большое. Я сделал небольшое дополнение, чтобы получить только код состояния (я знаю, что не просил об этом, но, по крайней мере, мне удалось вычислить _that_ part. '| Select StatusCode' после'}} '). Я спрошу одну последнюю вещь: я заметил, что она возвращает окончательный код состояния, а не любые промежуточные продукты, например 301/302. Мне ничего не показалось на странице «Invoke-WebRequest» MS TechNet, которая предложила, как это сделать. Возможно ли это (чтобы заставить его остановиться на 301, а не следовать за ним до конечного результата? – Kurt