Как передать значение динамической переменной PowerShell в JSON

Я работаю над проектом, чтобы на компьютерах под управлением Windows запускался запланированный сценарий PowerShell, который будет отображать статус хоста POST как файл структурированных данных JSON. Цель состоит в том, чтобы один и тот же сценарий мог работать на любом компьютере с Windows без необходимости вручную вводить значения переменных для каждого сервера, на котором будет размещен сценарий, то есть имени хоста, IP-адреса и т. д.

$hn = hostname
$ip = ipconfig
echo $hn
echo $ip
$params = '{
"host": "$(hn)",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
“ip": "$(ip)"
}'

Invoke-WebRequest -Uri http://yoursite.com:5550/ -Method POST -ContentType "application/json" -Body $params
#Invoke-RestMethod -Uri http://yoursite.com:5550/ -Method POST -ContentType "application/json" -Body $params

И я получаю варианты следующего вывода (обратите внимание, что переменные hostname и ip остались прежними):

HOSTNAME1
1.1.1.1
'{
"host": "$(hn)",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
“ip": "$(ip)"
}'

Я бы хотел, чтобы результат выглядел следующим образом:

HOSTNAME1
1.1.1.1
'{
"host": "HOSTNAME1",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
“ip": "1.1.1.1"
}'

Я попробовал предложения, упомянутые на следующих веб-сайтах:

Я пробовал комбинировать двойные и одинарные кавычки и работать с @ {}, @ '{и добавлять к параметру, то есть "param + =" или "param = +". методы безуспешны или, может быть, я что-то упускаю.

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

Get-WmiObject -Class Win32_ComputerSystem -Property Name | ConvertTo-Json

Но мне сложно объединить две разные информации в один файл json. Кроме того, мне сложно извлечь определенную информацию и заполнить файл json, т.е.

(Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name | ConvertTo-Json

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

Чтобы получить расширение строки (интерполяцию) в PowerShell, используйте строки "..." - строки '...', напротив, обрабатываются как литералы. Чтобы встроить " в "...", используйте `".

mklement0 26.07.2018 04:14
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
6
1
8 736
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете попробовать.

  $params = '{
    "host": "'+$hn+'",
    "service": "APP_NAME",
    "annotation": "Service is looking dope!",
    “ip": "'+$ip+'"
    }'

Это просто показывает, что вся строка разбита на части и объединены (+) переменные, поскольку вы используете одинарные кавычки. Кроме того, вы можете прочитать об этом здесь: MSDN о правилах цитирования

ваш скрипт тоже работал! К сожалению, я не могу обозначить оба ваших ответа как решения. Спасибо вам всем.

unitelife 26.07.2018 18:15

не волнуйся, бутон, есть еще много способов снять шкуру с кошки;)

CodeNagi 27.07.2018 07:44
Ответ принят как подходящий

Вам нужно инвертировать кавычки в строке JSON. Все, что находится внутри одинарных апострофов, не анализируется для включения чего-либо вычислимого. Или, в качестве альтернативы, используйте Here-String следующим образом:

$params = @"
{
"host": "$hn",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
"ip": "$ip"
}
"@

PS: получение IP-адреса должно (возможно) быть лучше сделано способом Powershell: Get-NetIPAddress (params)| Select IPAddress.

твой скрипт сработал! Однако как заставить работать переменную Get-NetIPAddress (params)| Select IPAddress? У меня была аналогичная проблема при использовании метода PowerShell для получения имени хоста. Спасибо

unitelife 26.07.2018 18:14

@unitelife Get-Help Get-NetIPAddress, прочтите это и замените (params) соответствующим набором параметров.

Vesper 27.07.2018 05:57

Другие вопросы по теме