Как получить значения вне цикла - powershell - PullRequest
0 голосов
/ 23 октября 2018

Здравствуйте, я написал небольшую функцию для проверки доступности веб-сайта.Я хотел бы вывести значение - статус за его пределы и создать хороший вывод HTML.Мне пришлось использовать цикл для проверки каждого веб-сайта с помощью хеша $.

Function MyFunction{
clear-host
$hash = @{"ING"= "http://google.pl/" ; "youtube" = "https://youtube.com/" ;}
$weburl = $hash.Values 
foreach ($weburls in $weburl){ 
$HTTP_Request = [System.Net.WebRequest]::Create($weburls)
$HTTP_Response = $HTTP_Request.GetResponse() 
# We then get a response from the site.
$HTTP_Status = [int]$HTTP_Response.StatusCode # We then get the HTTP code as an integer.
If ($HTTP_Status -eq 404 -or $HTTP_Status -eq 503 -or $HTTP_Status -eq 403 ) {
    Write-Host "$weburls The Site may be down, please check. - status is $HTTP_Status!"
    $URLRESP = New-Object -TypeName psobject
    $URLRESP | Add-Member -MemberType NoteProperty -Name  Status -Value "The Site may be down, please check!"
    [array]$URLRES += $URLRESP
}
Else {
    Write-Host "OK"
    $URLRESP = New-Object -TypeName psobject
    $URLRESP | Add-Member -MemberType NoteProperty -Name  Status -Value "OK"
    [array]$URLRES += $URLRESP
}
$HTTP_Response.Close() # Finally, we clean up the http request by closing it.    }

Петля заканчивается здесь.Теперь я конвертирую его в html со значениями - Name, Value, Link, и здесь я хочу добавить новое значение - « Status » с результатами типа «ok» или «dead link» и т. Д.

    $hash.GetEnumerator() | sort -Property Name | Select-Object Name, Value, Status | 
    ConvertTo-HTML -Head $headLink  -Property *,@{Label="Link";Expression={"
}

$html_url = MyFunction 
Add-Type -AssemblyName System.Web
[System.Web.HttpUtility]::HtmlDecode($html_url) | Out-File  "\\......\scresult\test.htm" -Append

Я понятия не имею, как поставить значение "status" вне его.Извините, я не очень хорошо разбираюсь в сценариях и не знаю, как это сделать.У меня такое ощущение, что если я просто помещу выходную строку в цикл, она умножится на значение.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Ваш вопрос состоит из 2 частей.Как я могу получить данные?Как я могу передать его в ConvertTo-HTML?

Ваш первый вопрос решается путем создания Arraylist и добавления PSCustomObject со свойствами, которые вы хотите передать.Таким образом, вы можете получить окончательный возврат массива Hashtables с тем же Keys.

function GetSiteStatus(){
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        [hashtable]$WebSiteInfo
    )
    process{
        $Response = New-Object System.Collections.ArrayList
        $WebSiteInfo.GetEnumerator() | %{
            $Item = $_
            try{ 
                $status = Invoke-WebRequest -Uri $_.Value | %{
                    if(@('404','503','403') -match $_.StatusCode){
                        "$($Item.Key) The Site may be down, please check. - status is $($_.StatusCode)"
                    }else{
                        "OK"
                    }
                }
                $Response.Add([PSCustomObject]@{"Name"= $Item.Key; "Value"=$Item.Value; "Status"=$Status; "Link"=$($Item.value)}) | out-null
            }catch{
                $Status = "$($Item.Key), $_."
                $Response.Add([PSCustomObject]@{"Name"= $Item.Key; "Value"=$Item.Value; "Status"=$Status; "Link"=$($Item.value)}) | out-null
            }
        }
        return $Response
    }
}

Что касается второго вопроса, то, как вы используете функцию и передаете возврат вconvertto-html и out-file.

$HTML = @{
    "Test403" = "https://httpstat.us/403"; 
    "Test404" = "https://httpstat.us/404";
    "Test503" = "https://httpstat.us/503";
    "Google" = "http://www.Google.com";
    "GoogleFake" = "https://GoogleFAKE1312.com"
} | GetSiteStatus | ConvertTo-Html -Property Name,Value,Status,@{Label="Link";Expression={"<a href='$($_.Value)'>$($_.Name)</a>"}}

Add-Type -AssemblyName System.Web
[System.Web.HttpUtility]::HtmlDecode($HTML) | Out-File C:\TEST\test.htm
0 голосов
/ 23 октября 2018

Несколько изменений, и вот рабочий скрипт, который я смог протестировать.Я думаю, что это поможет вам получить то, что вы ищете

[System.Collections.ArrayList]$Results = @()

Function MyFunction {
    Clear-Host
    $hash = @{
        "ING"     = "http://google.com/"
        "youtube" = "https://youtube.com/"
    }    
    $weburl = $hash.Values 
    foreach ($url in $weburl){ 
        $HTTP_Request = [System.Net.WebRequest]::Create($url)
        $HTTP_Response = $HTTP_Request.GetResponse()
        $HTTP_Status = [int]$HTTP_Response.StatusCode

        If (($HTTP_Status -eq 404) -or ($HTTP_Status -eq 503) -or ($HTTP_Status -eq 403)) {
            Write-Host "$url The Site may be down, please check. - status is $HTTP_Status!"            
        }
        Else {
            Write-Host "$url is OK"            
        }
        $HTTP_Response.Close()

        $Result = [PSCustomObject]@{
            URL = $url
            Status = $HTTP_Status
        }
        $Results.Add($Result) | Out-Null
    }
}

MyFunction

$Results

РЕДАКТИРОВАТЬ

После повторного просмотра, если вы вызовете плохой ответ, он броситисключение.Вам нужно добавить некоторую обработку ошибок, например try catch, и, возможно, проанализировать ошибку, чтобы получить точный код ошибки.Я предположил, что при выполнении быстрого теста возвращался код ошибки.

Исключение вызывает "GetResponse" с аргументом (ами) "0": "Удаленный сервер возвратил ошибку: (503) СерверНедоступен."В строке: 1 символ: 1 + $ HTTP_Request.GetResponse () + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo: NotSpecified: (:)[], MethodInvocationException + FullyQualifiedErrorId: WebException

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...