Извлечение определенного объекта из массива JSON в виде строки, разделенной запятыми, с помощью PowerShell

#php #arrays #json #regex #powershell

#php #массивы #json #регулярное выражение #powershell

Вопрос:

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

Мой PHP-код (работает нормально, просто для справки):

 <?php
$host = $_SERVER['REMOTE_ADDR'];
$ports = array(
    20,
    443,
    49371
    );
echo "[";
foreach ($ports as $port)
{
    $connection = @fsockopen($host, $port, $errno, $errstr, 2);
    if (is_resource($connection))
    {
        echo '{' . '"Port":' . $port . ',' . '"status" : "open"' . "},";
        fclose($connection);
    }
    else
    {
        echo '{' . '"Port":' . $port . ', "status" : "closed"},';
    }
} ?> { "result": "done" } ]
  

Пример вывода HTML при вызове этого PHP-скрипта:

 [{"Port":20, "status" : "open"},{"Port":443, "status" : "open"},{"Port":49731, "status" : "closed"}, { "result": "done" } ]
  

Строка (как переменная), которую я пытаюсь достичь в Powershell:

 Open Ports = 20, 443
  

Мой код Powershell до сих пор:

 $Results = invoke-restmethod -uri "https://mywebsite.com/portscan.php"
$OpenPorts = $Results | Where-Object { $_.status -eq "open"} | ConvertFrom-Json
$Message = "Open Ports: $OpenPorts"
Write-host $Message
  

Ошибка, которую я не могу понять, как решить:

 ConvertFrom-Json : Invalid JSON primitive: .
At line:2 char:64
  ...  = $Results | Where-Object { $_.status -eq "open"} | ConvertFrom-Json
                                                           ~~~~~~~~~~~~~~~~
      CategoryInfo          : NotSpecified: (:) [ConvertFrom-Json], ArgumentException
      FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand
  

Любая помощь была бы искренне признательна, я не знаком с PowerShell, и это делает мою голову!

Ответ №1:

 # Invoke-RestMethod automatically parses the JSON result into
# a [pscustomobject] graph.
# In a manner of speaking, *ConvertFrom-Json is built in*.
$Results = Invoke-RestMethod -Uri "https://mywebsite.com/portscan.php"

# Get the objects representing open ports.
# Note: `Where-Object Status -eq open` is the equivalent of:
#       `Where-Object { $_.Status -eq 'open' }`
$OpenPorts = $Results | Where-Object Status -eq open

# Synthesize the output string.
$Message = "Open ports = "   ($OpenPorts.Port -join ', ')

# Output (echo) it.
# Output that isn't redirected or captured is *implicitly* echoed in PowerShell.
$Message