Powershell | DownloadString | Внешний сайт | Вернуть

0

Я совершенно новичок PowerShell, поэтому, пожалуйста, будьте снисходительны;)

Я пытаюсь написать скрипт, где машина проверяет внешний веб-сайт в ожидании слова «тест» для выполнения загрузки. Все идет так:

$Word = 'test'
$WebClientObject = New-Object Net.WebClient
$comment = "http://MySite.wordpress.com/comment_section/"
$WebClientObject.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36)")
While($True){
$CommentResult = $WebClientObject.DownloadString($comment)
$Found = $CommentResult.contains($Word)
If($Found) {
IEX $WebClientObject.DownloadString('http://A_Server_That_Is_Accessible/Tasks_to_do')
Task_to_do and some blabla commands
Return
}
Start-Sleep -Seconds 60
}

Я использую PowerShell 2.0. Windows 7

Что случилось:

  • загрузка не выполняется через интернет
  • это не проблема, исходящая от IP-адресов или путей

Что я сделал дальше:

  • Я непосредственно пишу различные команды в командной строке powershell:

-> while ($ True) инициирует бесконечный цикл, не выходя из него.

Чтобы сделать трюк, мне нужно «дважды щелкнуть на клавиатуре и вернуться», окончание цикла и команда «downloadstring» наконец выполнены.

Все еще помни, что я больше, чем новичок, верно? :(

  • я пытался "прервать", "вернуться" или "выйти", но невозможно выйти из цикла.
  • Я пытался вставить много двойного возврата каретки в мой сценарий также безуспешно.

Кто-нибудь, пожалуйста, укажет мне способ сделать эту простую вещь ...? :)

Большое спасибо.

Тома Гранджин
источник
3
Прежде всего, я бы рекомендовал перейти на более новую версию PowerShell. PowerShell 4 теперь доступен для Windows 7 , и, по крайней мере, вы должны использовать PowerShell 3 , чтобы получить дополнительные функциональные возможности, которые он предоставляет. Во-вторых, да, breakэто то , что должно делать то, что вы хотите. Можете ли вы включить код, который содержит breakи не работает?
HopelessN00b
перерыв , похоже, не является решением ... и моя цель состоит в том, чтобы люди из моей организации использовали этот сценарий, и у меня просто нет возможности обновить все машины до более новой версии Powershell ..
Тома Гранджин

Ответы:

2

В вашем скрипте есть как минимум три проблемы:

  1. containsне работает так, как вы думаете Он сообщает, включает ли набор эталонных значений одно тестовое значение. С точки зрения непрофессионала, он работает только с элементами массивов и ищет точное совпадение. Но вы получаете $CommentResultодну длинную строку, содержащую HTML-код всей страницы. Таким образом, containsрассматривается как массив с одним элементом, и поскольку этот элемент не является точным соответствием строки 'test', он возвращает False.
  2. В вашем ifблоке вам не нужно использовать Invoke-Expressionкомандлет ( IEXэто псевдоним для него) для вызова DownloadStringметода $WebClientObject.
  3. Вам действительно нужно сделать некоторую HTML парсинга (Html Agility пакет будет делать ), или , по крайней мере , регулярное выражение для соответствия слова (и это лучше , чтобы быть очень уникальным словом). Поскольку testсама строка может появляться в HTML как часть тега, например:
    <img src = ' http://server.com/pro test ant.jpg' />

Я исправил ваш скрипт для использования регулярных выражений и сопоставления всего, что содержит строку test(включая pro test , de test , la test , test ament и т. Д.) В HTML-коде веб-страницы. Попробуйте и измените в соответствии с вашими потребностями впоследствии:

$Word = 'test'
$comment = 'http://MySite.wordpress.com/comment_section/'

$WebClientObject = New-Object -TypeName Net.WebClient
$WebClientObject.Headers.Add('User-Agent", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36)')

While($true)
{
    if($WebClientObject.DownloadString($comment) -match $Word)
    {
        $Html = $WebClientObject.DownloadString('http://A_Server_That_Is_Accessible/Tasks_to_do')
        #Task_to_do and some blabla commands
        break
    }

    Start-Sleep -Seconds 60
}
beatcracker
источник