ConvertFrom-JSON в переменные для POST далее в PowerBI - PullRequest
0 голосов
/ 06 ноября 2019

Я получаю данные API с URL-адреса в следующем формате:

{
  "printers" : [ {
    "name" : "printsrv01\\printer01",
    "status" : "OK",
    "lastPrintJobSeconds" : 6495,
    "heldJobsCount" : 0,
    "physicalPrinterId" : "net://192.168.0.51"
  }, {
    "name" : "printsrv01\\printer02",
    "status" : "OK",
    "heldJobsCount" : 0,
    "physicalPrinterId" : "net://192.168.0.52"
  }, {
    "name" : "printsrv02\\printer03",
    "status" : "OK",
    "heldJobsCount" : 0,
    "physicalPrinterId" : "net://192.168.0.53"
  }, {
    "name" : "printsrv01\\printer04",
    "status" : "OK",
    "heldJobsCount" : 0,
    "physicalPrinterId" : "net://192.168.0.54"
  }, {
    "name" : "printsrv02\\printer05",
    "status" : "OK",
    "heldJobsCount" : 0,
    "physicalPrinterId" : "net://192.168.0.55"
  }, {
    "name" : "printsrv01\\printer06",
    "status" : "OK",
    "lastPrintJobSeconds" : 183162,
    "heldJobsCount" : 0,
    "physicalPrinterId" : "net://192.168.0.56"
  } ],
  "heldJobCountTotal" : 0,
  "heldJobsCountMax" : 0
}

Мне удалось преобразовать данные из JSON, используя следующий код:

while ($true) {
    $request = "http://serveradress:80/api/health/printers?Authorization=GHSKAskas0a5as5FFDA22asD"
    Invoke-WebRequest  $request |
        ConvertFrom-Json |
        select -Expand printers |
}

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

$payload = @{
    "name" = $name
    "status" = $status
    "lastPrintJobSeconds" = $lastPrintJobSeconds
    "heldJobsCount" = $heldJobsCount
    "physicalPrinterId" = $physicalPrinterId
}
Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @($payload))

Как поместить информацию о каждом принтере в каждую переменную, чтобы отправить ее в источник данных PowerBI, используемый для отображения?


Редактировать:

Я пытался использовать решение, предложенное @ TheldesOfMark :

$endpoint = "https://api.powerbi.com/beta/aaa555v22-66888-ccc6-95aa-0dfb5dc31330/datasets/aaa555a666-6547-4250-950c-25s5sd5s5s5s5/rows?key=65asd55asd45asd45asd5as5d4!%54dsa5f45fc4zd56fc4"

while ($true) {
    $request = "http://server:80/api/health/printers?Authorization=asd54asas5dSSd55sd4as65d4ASDA"
    Invoke-WebRequest  $request |
        ConvertFrom-Json |
        select -Expand printers |

    foreach ($printer in $printers) {
        $payload = @{
            "name" = $printer.name
            "status" = $printer.status
            "lastPrintJobSeconds" = $printer.lastPrintJobSeconds
            "heldJobsCount" = $printer.heldJobsCount
            "physicalPrinterId" = $printer.physicalPrinterId
        }
        Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @($payload))
        Write-Host "Name: " $printer.name " Status: " $printer.status " lastPrintJobSeconds: " $printer.lastPrintJobSeconds " heldJobsCount: " $printer.heldJobsCount " physicalPrinterId: " $printer.physicalPrinterId
    }
    sleep 2
}
}

, но оно генерирует следующееошибки:

At line:10 char:22
+     foreach ($printer in $printers) {
+                       ~~
Unexpected token 'in' in expression or statement.
At line:10 char:21
+     foreach ($printer in $printers) {
+                      ~
Missing closing ')' in expression.
At line:4 char:1
+ {
+ ~
Missing closing '}' in statement block or type definition.
At line:10 char:34
+     foreach ($printer in $printers) {
+                                   ~
Unexpected token ')' in expression or statement.
At line:22 char:5
+     }
+     ~
Unexpected token '}' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

Кажется, проблема в цикле foreach? Если я не конвертирую из JSON, это не выдаст никаких ошибок, но я не получу никаких данных, если попробую без конвертации.

Редактировать 2

Изменил Invoke-WebRequest на ниже, и Write Output работает, он печатает данные правильно. Но я получаю сообщение об ошибке Invoke-RestMethod:

$printers = Invoke-WebRequest 'http://server:80/api/health/printers?Authorization=asd54asas5dSSd55sd4as65d4ASDA' | ConvertFrom-Json | select -Expand printers

Код ошибки следующий:

Invoke-RestMethod : {"error":{"message":"The request was blocked by KeyBlocker "}}
At line:14 char:9
+         Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @( ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

Редактировать 3

$endpoint = "PowerBI_URL"
Invoke-WebRequest 'API_URL' |
    ConvertFrom-Json |
    Select-Object -Expand printers |
    ForEach-Object {
        Invoke-RestMethod -Method Post -Uri "$endpoint" (ConvertTo-Json @($_))
    }

Код ошибки:

Invoke-RestMethod : A positional parameter cannot be found that accepts argument '[
    {
        "name":  "printsrv01\\printer01",
        "status":  "OK",
        "heldJobsCount":  0,
        "physicalPrinterId":  "net://192.168.0.51"
    }
]'.
At line:6 char:9
+         Invoke-RestMethod -Method Post -Uri "$endpoint" (ConvertTo-Json @($_))
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-RestMethod], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

Кажется, что не все значения напечатаны. Не хватает некоторых.

Редактировать 4 - Рабочий скрипт

$endpoint = "https://api.powerbi.com/beta/nnf5d2dsf1-4588-88gh-b6a4-0dfb5dc31330/datasets/55562ee92-9c7d-8850-854g-1a39asdd8a4b/rows?key=ljrethjkreRDFG545REWFGGDF0DFGDGF"

while ($true) {
    $printers = Invoke-WebRequest 'http://server/api/health/printers?Authorization=sdfkjdsf044s21sDSFsdf54sdf' | ConvertFrom-Json | select -Expand printers

    foreach ($printer in $printers) {
        $payload = @{
            "name" = $printer.name
            "status" = $printer.status
            "lastPrintJobSeconds" = $printer.lastPrintJobSeconds
            "heldJobsCount" = $printer.heldJobsCount
            "physicalPrinterId" = $printer.physicalPrinterId
        }
        Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @($payload))
        #Write-Host "Name: " $printer.name " Status: " $printer.status " lastPrintJobSeconds: " $printer.lastPrintJobSeconds " heldJobsCount: " $printer.heldJobsCount " physicalPrinterId: " $printer.physicalPrinterId
        sleep 1
    }

}

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

AFAICS вам не нужно извлекать отдельные значения в отдельные переменные. Просто добавьте ForEach-Object в ваш конвейер, где вы преобразуете текущий объект в JSON и вызовете запрос POST с этим.

Invoke-WebRequest $request |
    ConvertFrom-Json |
    Select-Object -Expand printers |
    ForEach-Object {
        $data = ConvertTo-Json $_
        Invoke-RestMethod -Method Post -Uri $endpoint -Body $data
    }
1 голос
/ 06 ноября 2019

Ответ Ансгара - лучший ответ, на мой взгляд. Но в случае, если есть какая-то причина, вам нужно, чтобы эта информация была доступна другим процессам PS. Вы можете преобразовать переменные из вашего текущего скрипта, просто просматривая созданный вами массив и назначая переменные.

ForEach($printer in $printers){
    $payload = @{
        "name" = $printer.name
        "status" = $printer.status
        "lastPrintJobSeconds" = $printer.lastPrintJobSeconds
        "heldJobsCount" = $printer.heldJobsCount
        "physicalPrinterId" = $printer.physicalPrinterId
    }
    Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @($payload))
}
...