Я работаю над проектом, чтобы на компьютерах под управлением 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"
}'
Я попробовал предложения, упомянутые на следующих веб-сайтах:
Как сделать POST-запрос с помощью Powershell, если в теле есть параметр @type
https://hazzy.techanarchy.net/winadmin/windows/windows-powershell-elk-log-wash/
Я пробовал комбинировать двойные и одинарные кавычки и работать с @ {}, @ '{и добавлять к параметру, то есть "param + =" или "param = +". методы безуспешны или, может быть, я что-то упускаю.
Я могу получить подробную информацию об отдельных командах, преобразованных в их счетную часть JSON, т.е.
Get-WmiObject -Class Win32_ComputerSystem -Property Name | ConvertTo-Json
Но мне сложно объединить две разные информации в один файл json. Кроме того, мне сложно извлечь определенную информацию и заполнить файл json, т.е.
(Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name | ConvertTo-Json
Прошу прощения, если я неправильно использовал терминологию или не соблюдал правила публикации. Если я нарушил какие-либо условия, сообщите мне, и я внесу необходимые изменения, чтобы их соблюдать. Прошу прощения, если я не понял или упустил важную информацию. Заранее благодарим вас, и любая помощь будет принята с благодарностью.

Вы можете попробовать.
$params = '{
"host": "'+$hn+'",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
“ip": "'+$ip+'"
}'
Это просто показывает, что вся строка разбита на части и объединены (+) переменные, поскольку вы используете одинарные кавычки. Кроме того, вы можете прочитать об этом здесь:
MSDN о правилах цитирования
ваш скрипт тоже работал! К сожалению, я не могу обозначить оба ваших ответа как решения. Спасибо вам всем.
не волнуйся, бутон, есть еще много способов снять шкуру с кошки;)
Вам нужно инвертировать кавычки в строке 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 Get-Help Get-NetIPAddress, прочтите это и замените (params) соответствующим набором параметров.
Чтобы получить расширение строки (интерполяцию) в PowerShell, используйте строки
"..."- строки'...', напротив, обрабатываются как литералы. Чтобы встроить"в"...", используйте`".