2013-12-11 3 views
7

Я полный новичок в разработке Powershell, и я пытаюсь написать командлет Powershell в C#, который будет использоваться в качестве интерфейса для REST API.Какова наилучшая практика сохранения состояния между вызовами командлетов Powershell?

Я хотел бы иметь какое-то командное меню установки, где пользователю будет предложено ввести Uri, имя пользователя и пароль в REST API, а затем вызвать Cmldlets, такие как Get-Item, без необходимости вводить эти параметры. В значительной степени, как и поставщик Azure для Powershell, вы можете установить текущую подписку, вызвав Select-AzureSubscription, а затем вызвать Save-AzureVhd без необходимости снова вводить имя подписки.

Каковы наилучшие методы хранения состояния между вызовами на разные Командлеты?

EDIT: Я не уверен, что это лучший способ его решить, но я сделал то, что я добавил класс singleton, который содержит состояние. У меня есть одно командлет, Select-Project -Name MyProject, который устанавливает публичное свойство в моем одиночном классе, а затем мои другие командлеты могут получить доступ к этому свойству.

ответ

1

Если они работают под управлением V3 или выше, вы можете настроить эти значения в $ PSDefaultParameterValues.

См:

get-help about_parameters_default_values 

Подробные сведения о настройке значений.

+0

Возможно, это одно решение, но оно кажется довольно сложным, когда вам нужно обновить его с помощью кода C#. – RobinHu

0

Возможно, что-то вроде поддержки CimSession от powershell? Вы используете new-cimsession для создания сеанса (который содержит состояние), а затем передаете объект cimession другим командлетам. Это не будет работать с get-item, как указано в OP.

Однако EDIT в OP описывает реализацию, которая вряд ли будет работать с get-item (если я правильно понимаю).

Если бы поддержка get-item была действительно требованием, я полагаю, что провайдер PS (как в get-PSProvider) был бы способ пойти. Поставщики PS будут работать с командлетами, такими как get-item, и могут удерживать состояние через PSDrives (как в get-PSDrive).