Хотя вы не можете использовать инжектор конструктора для этого, вы можете использовать сам командлет. Выполните первый вызов для него с одним параметром, установленным для инициализации, сохраните соответствующую информацию в текущем состоянии сеанса, а последующие вызовы извлекут сохраненное значение из состояния сеанса.
Здесь я использовал одну строку, message
для представления сохраненного значения; но, очевидно, вы можете иметь столько параметров / любых типов, которые вам нравятся.
Примечание: приведенный ниже C # обернут в PowerShell, так что вы можете протестировать все это непосредственно в PS.
$cs = @'
using System.Management.Automation;
[Cmdlet(VerbsDiagnostic.Test, "Ploeh", DefaultParameterSetName = "None")]
public class PloehCmdlet : PSCmdlet
{
const string InitialiseParameterSetName = "Initialise";
const string MessageVariable = "Test_Ploeh_Message_39fbe50c_25fc_48b1_8348_d155cad99e93"; //since this is held as a variable in the session state, make sure the name will not clash with any existing variables
[Parameter(Mandatory=true, ParameterSetName = InitialiseParameterSetName)]
public string InitialiseMessage
{
set { SaveMessageToSessionState(value); }
}
protected override void ProcessRecord()
{
if (this.ParameterSetName != InitialiseParameterSetName) //do not run the cmdlet if we're just initialising it
{
this.WriteObject(GetMessageFromSessionState());
base.ProcessRecord();
}
}
void SaveMessageToSessionState(string message)
{
this.SessionState.PSVariable.Set(MessageVariable, message);
}
string GetMessageFromSessionState()
{
return (string)this.SessionState.PSVariable.GetValue(MessageVariable);
}
}
'@
#Trick courtesy of: http://community.idera.com/powershell/powertips/b/tips/posts/compiling-binary-cmdlets
$DLLPath = Join-Path $env:temp ('CSharpPSCmdLet{0:yyyyMMddHHmmssffff}.dll' -f (Get-Date))
Add-Type -OutputAssembly $DLLPath -Language 'CSharp' -ReferencedAssemblies 'System.Management.Automation.dll' -TypeDefinition $cs
Import-Module -Name $DLLPath -Force -Verbose
#demo commands
Test-Ploeh -InitialiseMessage 'this is a test'
Test-Ploeh
Test-Ploeh
Test-Ploeh -InitialiseMessage 'change value'
Test-Ploeh
Test-Ploeh
"NB: Beware, your value can be accessed / amended outside of your cmdlet: $Test_Ploeh_Message_39fbe50c_25fc_48b1_8348_d155cad99e93"
$Test_Ploeh_Message_39fbe50c_25fc_48b1_8348_d155cad99e93 = "I've changed my mind"
Test-Ploeh
Пример вывода
VERBOSE: Loading module from path 'C:\Users\UserNa~1\AppData\Local\Temp\CSharpPSCmdLet201711132257130536.dll'.
VERBOSE: Importing cmdlet 'Test-Ploeh'.
this is a test
this is a test
change value
change value
NB: Beware, your value can be accessed / amended outside of your cmdlet: change value
I've changed my mind