Не удается получить PSVariable из метода Powershell Invoke - PullRequest
1 голос
/ 06 мая 2020

Я запускаю C# код PowerShell в удаленной системе, и мне нужно получить значение локальной переменной. В PowerShell есть командлет с именем Get-Variable, который я пытаюсь использовать. Это мой код для попытки получить соответствующую коллекцию PSVariables (которая, очевидно, должна содержать только одну):

psShell.AddScript($"$text = 'someValue'");

psShell.Invoke();

psShell.Commands.Clear();

psShell.AddCommand("Get-Variable")
.AddParameter("Name", "text");

var v = psShell.Invoke<PSVariable>();

Проблема в последней строке, я получаю следующее исключение:

Cannot convert the "System.Management.Automation.PSVariable" value of type "Deserialized.System.Management.Automation.PSVariable" to type "System.Management.Automation.PSVariable".

Кто-нибудь знает, как это решить?

Кроме того, я знаю метод SessionStateProxy, упомянутый в StackOverflow, но , поскольку этот мой пост показывает , он не работает для моего сценария почему-то.

1 Ответ

1 голос
/ 06 мая 2020

Когда задействовано удаленное взаимодействие PowerShell, только несколько хорошо известных типов десериализуются с верностью типа, System.Management.Automation.PSVariable не среди них. -less эмуляции исходных объектов, как [psobject] экземпляров со свойствами, содержащими c копии исходных значений свойств.
В PowerShell эти экземпляры сообщают свое имя типа как имя исходного типа с префиксом Deserialized.
См. этот ответ для получения справочной информации.

Самый простой способ обработки таких объектов - через DLR:

dynamic v = psShell.Invoke();

Тогда вы может получить доступ к свойствам как обычно (хотя и с привязкой во время выполнения), например, v.Name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...