Вызов сценария PowerShell из VBScript и использование кавычек в передаваемой переменной (переменная формата JSON)

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

Сначала я попытался отправить строку JSON непосредственно из VBScript, но всегда получаю ошибку «msxml3.dll: не удалось установить соединение с сервером», которую я не могу исправить. Итак, я протестировал JSON POST от PS, и он сразу заработал.

В своей бесконечной мудрости я тогда решил вызвать сценарий PS из VBScript, но это открыло собственную банку с червями. Два самых больших червя, о которых я здесь говорю, это: 1) попытка правильно ответить на звонок и 2) работа с кавычками.

Это вызов PS из моего VBS:

strOut = "{""integrationName"":""WhatsUpGold"",""actionName"":""WhatsUpGold"",""sourceId"":""" & LogID & """,""payload"":{""UID"":""" & LogID & """,""MD"":""SPNVMSA116"",""Agent_Class"":""WhatsUp Gold"",""Agent_Instance"":""" & mon_name & """,""Client"":""BCX"",""Date"":""" & ActMonStartTimeDate & """,""Time"":""" & ActMonStartTimeTime & """,""ESMTool"":""WhatsUp Gold"",""Severity"":""" & state & """,""State"":""" & mon_state_override & """,""Server"":""" & disp_name & """,""Instance_Detail"":""Server"",""UserData"":""" & payload & """}}"

Context.LogMessage mon_state & " " & disp_name & " -ACTIVE " &  mon_name & " monitor alert:           " & strOut

Dim objShell, intReturnCode
Set objShell = CreateObject("Wscript.Shell")
intReturnCode = objShell.Run("powershell.exe -noexit set-ExecutionPolicy Unrestricted -c .\c:\SXI\SXI_post_active3.ps1 " & strOut)
MsgBox intReturnCode

Это мой PS-скрипт:

******************************************************************************************
$content = $args[0]

[hashtable]$headers=@{}

$headers.Add("Authorization", "Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
$headers.Add('Content-Type', 'application/json')
$headers.Add('Accept', 'application/json')

$uri = "https://mywebservice"

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
Invoke-RestMethod -Method 'POST' -Uri $uri -Headers $headers -Body $content

*****************************************************************************************

Переменная strOut в моем VBScript проходит тест JSON, поэтому я подумал, что все будет в порядке, но когда я выполняю свой VBS, я получаю следующую ошибку из вывода сценария PS:

At line:1 char:95
+ ... c .\c:\SXI\SXI_post_active3.ps1 {integrationName:WhatsUpGold,actionNa ...
+                                                                 ~
Missing argument in parameter list.
At line:1 char:156
+ ... actionName:WhatsUpGold,sourceId:4904575,payload:{UID:4904575,MD:SPNVM ...
+                                                                 ~
Missing argument in parameter list.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingArgument

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

В последний раз, когда я боролся с кавычками в PowerShell, я забыл об обратном символе, позволяющем избежать кавычек. Я не уверен, применимо ли это здесь, но я думаю, что использование обратного апострофа может помочь предотвратить удаление кавычек PS.

LesFerch 05.07.2024 15:27

Для начала уберите set- перед -ExecutionPolicy Unrestricted"powershell.exe -noexit -ExecutionPolicy Unrestricted -c .\c:\SXI\SXI_post_active3.ps1 " & strOut

Daniel 05.07.2024 16:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Пример кода vbscript (поскольку PowerShell для простоты допускает использование одинарных кавычек вокруг аргументов)

Dim strLogId, strMonName, strActMonStartTimeDate, strActMonStartTimeTime
strLogId = "LogIDA"
strMonName = "MonNameA"
strActMonStartTimeDate = "2022-04-23"
strActMonStartTimeTime = "23:12:12"
intReturnCode = objShell.Run("powershell.exe -noprofile -noexit -ExecutionPolicy Unrestricted -Command c:\temp\b.ps1 '" & strLogId & "' '" & strMonName & "' '" & strActMonStartTimeDate & "' '" & strActMonStartTimeTime & "'")
'MsgBox intReturnCode

Пример сценария PowerShell

param(
    $LogID,
    $mon_name,
    $ActMonStartTimeDate,
    $ActMonStartTimeTime
)

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = $true 

$content = [pscustomobject]@{
    integrationName = 'WhatsUpGold'
    actionName      = 'WhatsUpGold' 
    sourceId        = $LogID
    payload         = [pscustomobject]@{
        uid = $LogID; MD = 'SPNVMSA116'
        Agent_Class = 'WhatsUp Gold'
        Agent_Instance = $mon_name
        Client = 'BCX'
        Date = $ActMonStartTimeDate
        Time = $ActMonStartTimeTime
        ESMTool = 'WhatsUp Gold' 
    } 
} | ConvertTo-Json 


[hashtable]$headers = @{}

$headers.Add('Authorization', 'Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') $headers.Add('Content-Type', 'application/json') $headers.Add('Accept', 'application/json')

$uri = 'https://mywebservice'

Invoke-RestMethod -Method 'POST' -Uri $uri -Headers $headers -Body $content

Марк, ты спаситель! Ваш ответ был идеальным решением и сработал без проблем.

Graham Van der vaart 06.07.2024 15:26

Рад, что помог @GrahamVandervaart :)

Daniel 06.07.2024 16:13

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