mirror of
https://github.com/aphrody-labs/PowerShell.git
synced 2026-10-27 00:48:53 +00:00
* Update TestService * Update WebListener * Update Controllers * Update ExpTest * Update MyApp * Update Logic * Update Logic * Update MyApp * Update Microsoft.Management.Infrastructure.CimCmdlets * Update Microsoft.PowerShell.Commands.Diagnostics * Update Microsoft.PowerShell.ScheduledJob * Update Microsoft.WSMan.Management * Update Microsoft.WSMan.Runtime * Update ResGen * Update TypeCatalogGen * Update commands * Update Eventing * Update Reader * Update utility * Update ShowCommand * Update trace * Update WebCmdlet * Update Common * Update CoreCLR * Update common * Update format-object * Update format-wide * Update out-file * Update out-printer * Update out-string * Update OutGridView * Update LocalAccounts * Update Commands * Update security * Update CoreCLR * Update DscSupport * Update engine * Update help * Update logging * Update namespaces * Update security * Update utils * Update config * Update perfCounters * Update tracing * Update cmdletization * Update other * Update cim * Update xml * Update CoreCLR * Update common * Update DefaultFormatters * Update out-console * Update out-textInterface * Update DisplayDatabase * Update Utilities * Update COM * Update ComInterop * Update CommandCompletion * Update debugger * Update ExperimentalFeature * Update hostifaces * Update interpreter * Update lang * Update Modules * Update parser * Update runtime * Update client * Update commands * Update common * Update fanin * Update server * Update WireDataFormat * Update Binding * Update Operations * Update interface * Update cmdletization * Update cim * Update management * Update WindowsTaskbarJumpList * Update msh
228 lines
8.0 KiB
C#
228 lines
8.0 KiB
C#
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Management.Automation;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
|
|
//
|
|
// Now define the set of commands for manipulating modules.
|
|
//
|
|
|
|
namespace Microsoft.PowerShell.Commands
|
|
{
|
|
#region New-Module
|
|
|
|
/// <summary>
|
|
/// Implements a cmdlet that creates a dynamic module from a scriptblock..
|
|
/// </summary>
|
|
[Cmdlet(VerbsCommon.New, "Module", DefaultParameterSetName = "ScriptBlock", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=141554")]
|
|
[OutputType(typeof(PSModuleInfo))]
|
|
public sealed class NewModuleCommand : ModuleCmdletBase
|
|
{
|
|
/// <summary>
|
|
/// This parameter specifies the name to assign to the dynamic module.
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "Name", Mandatory = true, ValueFromPipeline = true, Position = 0)]
|
|
public string Name
|
|
{
|
|
set { _name = value; }
|
|
|
|
get { return _name; }
|
|
}
|
|
|
|
private string _name;
|
|
|
|
/// <summary>
|
|
/// Specify a scriptblock to use for the module body...
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "Name", Mandatory = true, Position = 1)]
|
|
[Parameter(ParameterSetName = "ScriptBlock", Mandatory = true, Position = 0)]
|
|
[ValidateNotNull]
|
|
public ScriptBlock ScriptBlock
|
|
{
|
|
get { return _scriptBlock; }
|
|
|
|
set
|
|
{
|
|
_scriptBlock = value;
|
|
}
|
|
}
|
|
|
|
private ScriptBlock _scriptBlock;
|
|
|
|
/// <summary>
|
|
/// This parameter specifies the patterns matching the functions to import from the module...
|
|
/// </summary>
|
|
[Parameter]
|
|
[ValidateNotNull]
|
|
[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "Cmdlets use arrays for parameters.")]
|
|
public string[] Function
|
|
{
|
|
set
|
|
{
|
|
if (value == null)
|
|
return;
|
|
|
|
_functionImportList = value;
|
|
// Create the list of patterns to match at parameter bind time
|
|
// so errors will be reported before loading the module...
|
|
BaseFunctionPatterns = new List<WildcardPattern>();
|
|
foreach (string pattern in _functionImportList)
|
|
{
|
|
BaseFunctionPatterns.Add(WildcardPattern.Get(pattern, WildcardOptions.IgnoreCase));
|
|
}
|
|
}
|
|
|
|
get { return _functionImportList; }
|
|
}
|
|
|
|
private string[] _functionImportList = Utils.EmptyArray<string>();
|
|
|
|
/// <summary>
|
|
/// This parameter specifies the patterns matching the cmdlets to import from the module...
|
|
/// </summary>
|
|
[Parameter]
|
|
[ValidateNotNull]
|
|
[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "Cmdlets use arrays for parameters.")]
|
|
public string[] Cmdlet
|
|
{
|
|
set
|
|
{
|
|
if (value == null)
|
|
return;
|
|
|
|
_cmdletImportList = value;
|
|
// Create the list of patterns to match at parameter bind time
|
|
// so errors will be reported before loading the module...
|
|
BaseCmdletPatterns = new List<WildcardPattern>();
|
|
foreach (string pattern in _cmdletImportList)
|
|
{
|
|
BaseCmdletPatterns.Add(WildcardPattern.Get(pattern, WildcardOptions.IgnoreCase));
|
|
}
|
|
}
|
|
|
|
get { return _cmdletImportList; }
|
|
}
|
|
|
|
private string[] _cmdletImportList = Utils.EmptyArray<string>();
|
|
|
|
/// <summary>
|
|
/// This parameter causes the session state instance to be written...
|
|
/// </summary>
|
|
[Parameter]
|
|
public SwitchParameter ReturnResult
|
|
{
|
|
get { return (SwitchParameter)_returnResult; }
|
|
|
|
set { _returnResult = value; }
|
|
}
|
|
|
|
private bool _returnResult;
|
|
|
|
/// <summary>
|
|
/// This parameter causes the session state instance to be written...
|
|
/// </summary>
|
|
[Parameter]
|
|
public SwitchParameter AsCustomObject
|
|
{
|
|
get { return (SwitchParameter)_asCustomObject; }
|
|
|
|
set { _asCustomObject = value; }
|
|
}
|
|
|
|
private bool _asCustomObject;
|
|
|
|
/// <summary>
|
|
/// The arguments to pass to the scriptblock used to create the module
|
|
/// </summary>
|
|
[Parameter(ValueFromRemainingArguments = true)]
|
|
[Alias("Args")]
|
|
[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "Cmdlets use arrays for parameters.")]
|
|
public object[] ArgumentList
|
|
{
|
|
get { return _arguments; }
|
|
|
|
set { _arguments = value; }
|
|
}
|
|
|
|
private object[] _arguments;
|
|
|
|
/// <summary>
|
|
/// Create the new module...
|
|
/// </summary>
|
|
protected override void EndProcessing()
|
|
{
|
|
// Create a module from a scriptblock...
|
|
if (_scriptBlock != null)
|
|
{
|
|
string gs = System.Guid.NewGuid().ToString();
|
|
if (String.IsNullOrEmpty(_name))
|
|
{
|
|
_name = PSModuleInfo.DynamicModulePrefixString + gs;
|
|
}
|
|
|
|
try
|
|
{
|
|
Context.Modules.IncrementModuleNestingDepth(this, _name);
|
|
|
|
List<object> results = null;
|
|
PSModuleInfo localModule = null;
|
|
try
|
|
{
|
|
// The path for a "dynamic" module will be a GUID so it's unique.
|
|
localModule = Context.Modules.CreateModule(_name, gs, _scriptBlock, null, out results, _arguments);
|
|
|
|
// Export all functions and variables if no exports were specified...
|
|
if (!localModule.SessionState.Internal.UseExportList)
|
|
{
|
|
List<WildcardPattern> cmdletPatterns = BaseCmdletPatterns ?? MatchAll;
|
|
List<WildcardPattern> functionPatterns = BaseFunctionPatterns ?? MatchAll;
|
|
|
|
ModuleIntrinsics.ExportModuleMembers(this,
|
|
localModule.SessionState.Internal,
|
|
functionPatterns, cmdletPatterns, BaseAliasPatterns, BaseVariablePatterns, null);
|
|
}
|
|
}
|
|
catch (RuntimeException e)
|
|
{
|
|
// Preserve the inner module invocation info...
|
|
e.ErrorRecord.PreserveInvocationInfoOnce = true;
|
|
WriteError(e.ErrorRecord);
|
|
}
|
|
|
|
// If the module was created successfully, then process the result...
|
|
if (localModule != null)
|
|
{
|
|
if (_returnResult)
|
|
{
|
|
// import the specified members...
|
|
ImportModuleMembers(localModule, string.Empty /* no -Prefix for New-Module cmdlet */);
|
|
WriteObject(results, true);
|
|
}
|
|
else if (_asCustomObject)
|
|
{
|
|
WriteObject(localModule.AsCustomObject());
|
|
}
|
|
else
|
|
{
|
|
// import the specified members...
|
|
ImportModuleMembers(localModule, string.Empty /* no -Prefix for New-Module cmdlet */);
|
|
WriteObject(localModule);
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
Context.Modules.DecrementModuleNestingCount();
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|