Проблема с powershel pscustomobject, записывающим только одну строку в файл - PullRequest
0 голосов
/ 04 апреля 2019

Я проверяю CSV-файл URL для кода состояния, возвращающего пользовательский объект. После этого я хочу записать его в файл. У меня это работает правильно, но я хочу отформатировать таблицу, иначе URL-адреса будут обрезаны. Я заставил это работать, но это не добавляет это к новой линии. Кроме того, как только я получу эту работу, я бы хотел отсортировать по статусу кода, чтобы я мог получить все 404-е наверх.

Я пробовал форматировать таблицу и кучу других вещей

[pscustomobject]@{
Code = $statusCode
Date = Get-Date -f yyyyMMdd
URL  = $url
} | Format-Table - Autosize

Это работает, но не создает новую строку каждый раз, как без.

Add-Type -AssemblyName System.Web
Add-Type -AssemblyName System.Web.Extensions
$inputPath = "\\Scripts\URLS\test.csv"
$outputPath = "\\Scripts\Results\statusCodeResults.txt"
$urlArray = Import-Csv -Path $inputPath | Select -ExpandProperty urls

function Get-WebStatus {  
  param($urlArray)

  foreach ($url in $urlArray) {
    try {
      $request = Invoke-WebRequest -Uri $url -Method GET
      $statusCode = $request.StatusCode
    }
    catch {
     $statusCode  = $_.Exception.Response.StatusCode.value__
    }

[pscustomobject]@{
Code = $statusCode
Date = Get-Date -f yyyyMMdd
URL  = $url
} 
}
}
Get-WebStatus -urlArray $urlArray | Out-File $outputPath

Хотелось бы, чтобы это выглядело так, но URL-адреса показывались полными, а затем, в конце концов, сортировались и все 404 сверху.

 Code Date     URL                                             
 ---- ----     ---                                             
 200 20190404 bsca.com/provider/account-tools/login/home.jhtml
 200 20190404 bsca.com/provider/home.jhtml                    
 200 20190404 bsca.com/provider/eligibility-benefits/eligib...
 200 20190404 bsca.com/provider/eligibility-benefits/home.j...
 200 20190404 bsca.com/provider/claims/home-auth.jhtml        
 200 20190404 bsca.com/provider/guidelines-resources/patien...
 200 20190404 bsca.com/provider/claims/search/home.jhtml      
 200 20190404 bsca.com/provider/claims/policies-guidelines/...
 404 20190404 bsca.com/provider/claims/view-rationale/home....
 200 20190404 bsca.com/provider/guidelines-resources/home.j...

1 Ответ

1 голос
/ 05 апреля 2019

Как уже упоминалось в комментариях, прямой слепой ответ на ваш вопрос заключается в использовании -Width параметра Out-File командлета с любым подходящим значением для ваших нужд, например:

Get-WebStatus -urlArray $urlArray | Out-File $outputPath -Width 200

И для этого странногоКороль полубуботовой сортировки, вы можете объединить два отфильтрованных массива следующим образом:

$url_responses_sorted = @(
    $url_responses | Where-Object -Property Code -EQ 404
    $url_responses | Where-Object -Property Code -NE 404
)

Но я рекомендую вам рассмотреть вопрос о сохранении массива [PSCustomObject] в формате CSV;таким образом, вы можете в любое время загрузить свои данные и работать с ними, используя самые разные языки / инструменты.

Export-Csv -Path $outputPath

Говоря о PowerShell, вы можете загружать свои данные с помощью командлета Import-Csv так же, как вы загружаете их.ваш $ urlArray, а затем отсортируйте его, сгруппируйте и отфильтруйте то, что вам нужно, например:

PS C:\> $url_responses = Get-WebStatus -urlArray $urlArray
PS C:\> $url_responses

Code Date     URL
---- ----     ---
200  20190405 /9283299/problema-s-powershel-pscustomobject-zapisyvayschim-tolko-odnu-stroku-v-fail...
404  20190405 https://google.com/non-existing-page
200  20190405 https://github.com/
0    20190405 https://non-existing.url/
404  20190405 https://google.com/non-existing-page-2

PS C:\> $url_responses | Sort-Object -Property Code -Descending

Code Date     URL
---- ----     ---
404  20190405 https://google.com/non-existing-page-2
404  20190405 https://google.com/non-existing-page
301  20190405 https://google.com/
200  20190405 /9283299/problema-s-powershel-pscustomobject-zapisyvayschim-tolko-odnu-stroku-v-fail...
0    20190405 https://non-existing.url/

PS C:\> $url_responses | Group-Object -Property Code

Count Name                      Group
----- ----                      -----
    2 200                       {@{Code=200; Date=20190405; URL=https://stackoverflow.com/questions/55521742/issue-w...
    1 301                       {@{Code=301; Date=20190405; URL=https://google.com/}}
    2 404                       {@{Code=404; Date=20190405; URL=https://google.com/non-existing-page}, @{Code=404; D...
    1 0                         {@{Code=0; Date=20190405; URL=https://non-existing.url/}}

PS C:\> $url_responses | Where-Object -Property Code -EQ 404

Code Date     URL
---- ----     ---
404  20190405 https://google.com/non-existing-page
404  20190405 https://google.com/non-existing-page-2

Другие соображения (об использовании Invoke-WebRequest)

  1. , если веб-серверы изВаш список URL поддерживает HEAD запросов, чем быстрее вы воспользуетесь этим методом вместо GET:
    $response = Invoke-WebRequest -Uri $Uri -Method HEAD
    
  2. , если вы также заинтересованы в кодах перенаправления, чем я предлагаю использовать -MaximumRedirection 0 с -ErrorAction SilentlyContinue (таким образом, сценарий подавляет сообщение об ошибке превышения максимального количества перенаправлений, что и является нашим намерением)
    $response = Invoke-WebRequest -Uri $Uri -Method HEAD -MaximumRedirection 0 -ErrorAction SilentlyContinue
    
  3. пропускная способность в наши дни невелика, поэтому нам не нужно открывать панель прогресса загрузкиза каждый запрос.Где нет какого-либо параметра, который вы могли бы передать Invoke-WebRequest, чтобы подавить прогресс, но мы могли бы временно отключить его глобально следующим образом:
    $progressPreference = 'silentlyContinue'
    $response = Invoke-WebRequest -Uri $Uri -Method HEAD -MaximumRedirection 0 -ErrorAction SilentlyContinue
    $progressPreference = 'Continue'
    
    Конечно, в вашем случае вы должны поместить присвоение этой переменной предпочтения за пределы вашего цикла.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...