Ссылка на вложенный объект PowerShell - PullRequest
0 голосов
/ 16 сентября 2018

Должно быть просто, но моя неопытность показывает.

Используя аналогичные данные, мне нужно создать INSERT для SQL Server в PowerShell 5:

{
   "Libraries": {
      "Reported": "2018-09-01T12:00:16",
      "Locations": {
         "Branch": [
            {
               "ID": "100",
               "Address": "1 Elm Street",
               "City": "Anytown",
               "State": "ST",
               "ZIP": "23466",
               "Phone": "999-123-6543",
               "Fax": "999-123-8395",
               "Admin": "Doe, Jane"
            },
            {
               "ID": "101",
               "Address": "4 Main Street",
               "City": "Anytown",
               "State": "ST",
               "ZIP": "23456",
               "Phone": "999-123-4567",
               "Fax": "999-123-4568",
               "Admin": "Mouse, Noni"
            }
         ]
      }
   }
}   

Сначала я хочу получить список следующим образом:

Branch  Admin        Address                           Phone         Fax
------  ---------    --------------------------------  ------------  -------------
100     Doe, Jane    1 Elm Street, Anytown, ST 23466   999-123-6543  999-123-8395
101     Mouse, Noni  4 Main Street, Anytown, ST 23456  999-123-4567  999-123-4568

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

Get-Content -Path c:\reports\libraries.json -raw | ConvertFrom-Json  | ...

Это в конечном итоге будет кормить Invoke-SQLCmd для:

Insert into Branch 
   (ID,Address,City,State,ZIP,Phone,Fax,Admin,Reviewed) 
Values
   (list from above)

Столбец DB Reviewed будет Reported из JSON.

1 Ответ

0 голосов
/ 16 сентября 2018

Вот как можно извлечь ветви из массива [pscustomobject] s из вашего ввода JSON, а также значение свойства Reported:

# Read the JSON file into a hierarchy of custom objects.
$objsFromJson = Get-Content -Raw t.json | ConvertFrom-Json

# Use dot notation to access the property values of interest.
$branches = $objsFromJson.Libraries.Locations.Branch
$reported = $objsFromJson.Libraries.Reported

Чтобы интегрировать их в строку, содержащую INSERT INTO Оператор SQL:

# Construct the arguments to the VALUES clause.
# Note: Assumes that all values are *strings*.
# Note: Only a limited number of arguments, presumably up to 1000, are supported.
$valuesClauseArgs = $branches | ForEach-Object {
  # Create a list of single-quoted property values enclosed in parentheses.
  "('" + ($_.psobject.properties.Value -join "', '") + "', '$reported')"
}

# Synthesize and output the full SQL statement
@"
INSERT INTO Branch 
  (ID,Address,City,State,ZIP,Phone,Fax,Admin,Reviewed) 
VALUES
  $($valuesClauseArgs -join ",`n  ");
"@

С вашим примером ввода приведенное выше выдает следующую строку:

INSERT INTO Branch 
  (ID,Address,City,State,ZIP,Phone,Fax,Admin,Reviewed) 
VALUES
  ('100', '1 Elm Street', 'Anytown', 'ST', '23466', '999-123-6543', '999-123-8395', 'Doe, Jane', '09/01/2018 12:00:16'),
  ('101', '4 Main Street', 'Anytown', 'ST', '23456', '999-123-4567', '999-123-4568', 'Mouse, Noni', '09/01/2018 12:00:16');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...