コード例 #1
0
        /// <summary>
        /// Uses ETS to set the property specified by name to the value on
        /// the target bindable object.
        /// </summary>
        /// <param name="name">
        ///     The name of the parameter to bind the value to.
        /// </param>
        /// <param name="value">
        ///     The value to bind to the parameter. It should be assumed by
        ///     derived classes that the proper type coercion has already taken
        ///     place and that any prerequisite metadata has been satisfied.
        /// </param>
        /// <param name="parameterMetadata"></param>
        /// <exception cref="SetValueException">
        /// If the setter raises an exception.
        /// </exception>
        internal override void BindParameter(string name, object value, CompiledCommandParameter parameterMetadata)
        {
            Diagnostics.Assert(!string.IsNullOrEmpty(name), "caller to verify name parameter");

            try
            {
                var setter = parameterMetadata != null
                    ? (parameterMetadata.Setter ?? (parameterMetadata.Setter = GetSetter(Target.GetType(), name)))
                    : GetSetter(Target.GetType(), name);
                setter(Target, value);
            }
            catch (TargetInvocationException ex)
            {
                Exception inner = ex.InnerException ?? ex;
                throw new SetValueInvocationException("CatchFromBaseAdapterSetValueTI",
                                                      inner,
                                                      ExtendedTypeSystem.ExceptionWhenSetting,
                                                      name, inner.Message);
            }
            catch (SetValueException) { throw; }
            catch (Exception e)
            {
                throw new SetValueInvocationException("CatchFromBaseAdapterSetValue",
                                                      e,
                                                      ExtendedTypeSystem.ExceptionWhenSetting,
                                                      name, e.Message);
            }
        }
コード例 #2
0
 private void RemoveParameter(CompiledCommandParameter parameter)
 {
     this.bindableParameters.Remove(parameter.Name);
     foreach (string alias in parameter.Aliases)
     {
         this.aliasedParameters.Remove(alias);
     }
 }
コード例 #3
0
 /// <summary>
 /// Constructs an association between the CompiledCommandParameter and the
 /// binder that should be used to bind it.
 /// </summary>
 /// <param name="parameter">
 /// The metadata for a parameter.
 /// </param>
 /// <param name="binderAssociation">
 /// The type of binder that should be used to bind the parameter.
 /// </param>
 internal MergedCompiledCommandParameter(
     CompiledCommandParameter parameter,
     ParameterBinderAssociation binderAssociation)
 {
     Diagnostics.Assert(parameter != null, "caller to verify parameter is not null");
     this.Parameter         = parameter;
     this.BinderAssociation = binderAssociation;
 }
コード例 #4
0
        } // GetDefaultParameterValue

        #endregion Parameter default values

        /// <summary>
        /// Uses ETS to set the property specified by name to the value on
        /// the target bindable object.
        /// </summary>
        /// <param name="name">
        ///     The name of the parameter to bind the value to.
        /// </param>
        /// <param name="value">
        ///     The value to bind to the parameter. It should be assumed by
        ///     derived classes that the proper type coercion has already taken
        ///     place and that any prerequisite metadata has been satisfied.
        /// </param>
        /// <param name="parameterMetadata"></param>
        /// <exception cref="ArgumentException">
        /// If <paramref name="name"/> is null or empty.
        /// </exception>
        internal override void BindParameter(string name, object value, CompiledCommandParameter parameterMetadata)
        {
            if (String.IsNullOrEmpty(name))
            {
                throw PSTraceSource.NewArgumentException("name");
            }

            Target[name].Value = value;
            this.CommandLineParameters.Add(name, value);
        } // BindParameter
コード例 #5
0
 private void ConstructCompiledParametersUsingRuntimeDefinedParameters(RuntimeDefinedParameterDictionary runtimeDefinedParameters, bool processingDynamicParameters, bool checkNames)
 {
     foreach (RuntimeDefinedParameter parameter in runtimeDefinedParameters.Values)
     {
         if (parameter != null)
         {
             CompiledCommandParameter parameter2 = new CompiledCommandParameter(parameter, processingDynamicParameters);
             this.AddParameter(parameter2, checkNames);
         }
     }
 }
コード例 #6
0
 internal CommandParameterInfo(CompiledCommandParameter parameter, uint parameterSetFlag)
 {
     using (CommandParameterInfo.tracer.TraceConstructor((object)this))
     {
         this.name          = parameter != null ? parameter.Name : throw CommandParameterInfo.tracer.NewArgumentNullException(nameof(parameter));
         this.parameterType = parameter.Type;
         this.isDynamic     = parameter.IsDynamic;
         this.aliases       = new ReadOnlyCollection <string>((IList <string>)parameter.Aliases);
         this.SetAttributes((IList <CompiledCommandAttribute>)parameter.CompiledAttributes);
         this.SetParameterSetData(parameter.GetParameterSetData(parameterSetFlag));
     }
 }
コード例 #7
0
ファイル: CommandParameterInfo.cs プロジェクト: nickchal/pash
 internal CommandParameterInfo(CompiledCommandParameter parameter, int parameterSetFlag)
 {
     if (parameter == null)
     {
         throw PSTraceSource.NewArgumentNullException("parameter");
     }
     this.name = parameter.Name;
     this.parameterType = parameter.Type;
     this.isDynamic = parameter.IsDynamic;
     this.aliases = new ReadOnlyCollection<string>(parameter.Aliases);
     this.SetAttributes(parameter.CompiledAttributes);
     this.SetParameterSetData(parameter.GetParameterSetData(parameterSetFlag));
 }
コード例 #8
0
 internal CommandParameterInfo(CompiledCommandParameter parameter, int parameterSetFlag)
 {
     if (parameter == null)
     {
         throw PSTraceSource.NewArgumentNullException("parameter");
     }
     this.name          = parameter.Name;
     this.parameterType = parameter.Type;
     this.isDynamic     = parameter.IsDynamic;
     this.aliases       = new ReadOnlyCollection <string>(parameter.Aliases);
     this.SetAttributes(parameter.CompiledAttributes);
     this.SetParameterSetData(parameter.GetParameterSetData(parameterSetFlag));
 }
コード例 #9
0
        private static string RetrieveParameterNameForAlias(string key, IDictionary <string, MergedCompiledCommandParameter> dict)
        {
            MergedCompiledCommandParameter parameter = dict[key];

            if (parameter != null)
            {
                CompiledCommandParameter parameter2 = parameter.Parameter;
                if ((parameter2 != null) && !string.IsNullOrEmpty(parameter2.Name))
                {
                    return(parameter2.Name);
                }
            }
            return(string.Empty);
        }
コード例 #10
0
        private static bool IsParameterMandatory(CompiledCommandParameter parameterMetadata)
        {
            bool flag = false;

            foreach (ParameterSetSpecificMetadata metadata in parameterMetadata.ParameterSetData.Values)
            {
                if (metadata.IsMandatory)
                {
                    flag = true;
                    break;
                }
            }
            tracer.WriteLine("isMandatory = {0}", new object[] { flag });
            return(flag);
        }
コード例 #11
0
 private void ValidateNullOrEmptyArgument(CommandParameterInternal parameter, CompiledCommandParameter parameterMetadata, Type argumentType, object parameterValue, bool recurseIntoCollections)
 {
     if ((parameterValue == null) && (argumentType != typeof(bool?)))
     {
         if (!parameterMetadata.AllowsNullArgument)
         {
             bindingTracer.WriteLine("ERROR: Argument cannot be null", new object[0]);
             ParameterBindingValidationException exception = new ParameterBindingValidationException(ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, argumentType, (parameterValue == null) ? null : parameterValue.GetType(), "ParameterBinderStrings", "ParameterArgumentValidationErrorNullNotAllowed", new object[0]);
             throw exception;
         }
     }
     else if (argumentType == typeof(string))
     {
         string str = parameterValue as string;
         if ((str.Length == 0) && !parameterMetadata.AllowsEmptyStringArgument)
         {
             bindingTracer.WriteLine("ERROR: Argument cannot be an empty string", new object[0]);
             ParameterBindingValidationException exception2 = new ParameterBindingValidationException(ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, (parameterValue == null) ? null : parameterValue.GetType(), "ParameterBinderStrings", "ParameterArgumentValidationErrorEmptyStringNotAllowed", new object[0]);
             throw exception2;
         }
     }
     else if (recurseIntoCollections)
     {
         switch (parameterMetadata.CollectionTypeInformation.ParameterCollectionType)
         {
         case ParameterCollectionType.IList:
         case ParameterCollectionType.Array:
         case ParameterCollectionType.ICollectionGeneric:
         {
             IEnumerator enumerator = LanguagePrimitives.GetEnumerator(parameterValue);
             bool        flag       = true;
             while (ParserOps.MoveNext(null, null, enumerator))
             {
                 object obj2 = ParserOps.Current(null, enumerator);
                 flag = false;
                 this.ValidateNullOrEmptyArgument(parameter, parameterMetadata, parameterMetadata.CollectionTypeInformation.ElementType, obj2, false);
             }
             if (flag && !parameterMetadata.AllowsEmptyCollectionArgument)
             {
                 bindingTracer.WriteLine("ERROR: Argument cannot be an empty collection", new object[0]);
                 ParameterBindingValidationException exception3 = new ParameterBindingValidationException(ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, (parameterValue == null) ? null : parameterValue.GetType(), "ParameterBinderStrings", (parameterMetadata.CollectionTypeInformation.ParameterCollectionType == ParameterCollectionType.Array) ? "ParameterArgumentValidationErrorEmptyArrayNotAllowed" : "ParameterArgumentValidationErrorEmptyCollectionNotAllowed", new object[0]);
                 throw exception3;
             }
             return;
         }
         }
     }
 }
コード例 #12
0
 private void AddParameter(CompiledCommandParameter parameter, bool checkNames)
 {
     if (checkNames)
     {
         this.CheckForReservedParameter(parameter.Name);
     }
     this.bindableParameters.Add(parameter.Name, parameter);
     foreach (string str in parameter.Aliases)
     {
         if (this.aliasedParameters.ContainsKey(str))
         {
             throw new System.Management.Automation.MetadataException("AliasDeclaredMultipleTimes", null, DiscoveryExceptions.AliasDeclaredMultipleTimes, new object[] { str });
         }
         this.aliasedParameters.Add(str, parameter);
     }
 }
コード例 #13
0
 private void AddParameter(CompiledCommandParameter parameter, bool checkNames)
 {
     if (checkNames)
     {
         this.CheckForReservedParameter(parameter.Name);
     }
     this.bindableParameters.Add(parameter.Name, parameter);
     foreach (string str in parameter.Aliases)
     {
         if (this.aliasedParameters.ContainsKey(str))
         {
             throw new System.Management.Automation.MetadataException("AliasDeclaredMultipleTimes", null, DiscoveryExceptions.AliasDeclaredMultipleTimes, new object[] { str });
         }
         this.aliasedParameters.Add(str, parameter);
     }
 }
コード例 #14
0
        /// <summary>
        /// Constructs the parameter info using the specified aliases, attributes, and
        /// parameter set metadata.
        /// </summary>
        /// <param name="parameter">
        /// The parameter metadata to retrieve the parameter information from.
        /// </param>
        /// <param name="parameterSetFlag">
        /// The parameter set flag to get the parameter information from.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// If <paramref name="parameter"/> is null.
        /// </exception>
        internal CommandParameterInfo(
            CompiledCommandParameter parameter,
            uint parameterSetFlag)
        {
            if (parameter is null)
            {
                throw PSTraceSource.NewArgumentNullException(nameof(parameter));
            }

            Name          = parameter.Name;
            ParameterType = parameter.Type;
            IsDynamic     = parameter.IsDynamic;
            Aliases       = new ReadOnlyCollection <string>(parameter.Aliases);

            SetAttributes(parameter.CompiledAttributes);
            SetParameterSetData(parameter.GetParameterSetData(parameterSetFlag));
        }
コード例 #15
0
        private void AddParameter(MemberInfo member, bool processingDynamicParameters)
        {
            bool flag1 = false;
            bool flag2 = false;

            this.CheckForReservedParameter(member.Name);
            if (this.bindableParameters.ContainsKey(member.Name))
            {
                CompiledCommandParameter bindableParameter = this.bindableParameters[member.Name];
                Type declaringType = bindableParameter.DeclaringType;
                if (declaringType == null)
                {
                    flag1 = true;
                }
                else
                {
                    InternalParameterMetadata.tracer.WriteLine("Existing parameter DeclaringType = {0}", (object)declaringType.FullName);
                    InternalParameterMetadata.tracer.WriteLine("New parameter DeclaringType = {0}", (object)member.DeclaringType);
                    if (declaringType.IsSubclassOf(member.DeclaringType))
                    {
                        flag2 = true;
                    }
                    else if (member.DeclaringType.IsSubclassOf(declaringType))
                    {
                        this.RemoveParameter(bindableParameter);
                    }
                    else
                    {
                        flag1 = true;
                    }
                }
            }
            if (flag1)
            {
                throw new MetadataException("DuplicateParameterDefinition", (Exception)null, "ParameterBinderStrings", "DuplicateParameterDefinition", new object[1]
                {
                    (object)member.Name
                });
            }
            if (flag2)
            {
                return;
            }
            this.AddParameter(new CompiledCommandParameter(member, processingDynamicParameters), true);
        }
コード例 #16
0
        private bool ShouldContinueUncoercedBind(CommandParameterInternal parameter, CompiledCommandParameter parameterMetadata, ParameterBindingFlags flags, ref object parameterValue)
        {
            bool flag = false;
            Type c    = parameterMetadata.Type;

            if (parameterValue == null)
            {
                return(((c == null) || ((flags & ParameterBindingFlags.IsDefaultValue) != ParameterBindingFlags.None)) || (!c.IsValueType && (c != typeof(string))));
            }
            Type type = parameterValue.GetType();

            if (type == c)
            {
                return(true);
            }
            if (type.IsSubclassOf(c))
            {
                return(true);
            }
            if (c.IsAssignableFrom(type))
            {
                return(true);
            }
            if ((parameterValue is PSObject) && !((PSObject)parameterValue).immediateBaseObjectIsEmpty)
            {
                parameterValue = ((PSObject)parameterValue).BaseObject;
                type           = parameterValue.GetType();
                if (((type == c) || type.IsSubclassOf(c)) || c.IsAssignableFrom(type))
                {
                    return(true);
                }
            }
            if (parameterMetadata.CollectionTypeInformation.ParameterCollectionType != ParameterCollectionType.NotCollection)
            {
                bool   coercionRequired = false;
                object obj2             = this.EncodeCollection(parameter, parameterMetadata.Name, parameterMetadata.CollectionTypeInformation, c, parameterValue, false, out coercionRequired);
                if ((obj2 != null) && !coercionRequired)
                {
                    parameterValue = obj2;
                    flag           = true;
                }
            }
            return(flag);
        }
コード例 #17
0
        } // GetParameterSetName

        /// <summary>
        /// Helper function to retrieve the name of the parameter
        /// which defined an alias.
        /// </summary>
        /// <param name="key"></param>
        /// <param name="dict"></param>
        /// <returns></returns>
        private static string RetrieveParameterNameForAlias(
            string key,
            IDictionary <string, MergedCompiledCommandParameter> dict)
        {
            MergedCompiledCommandParameter mergedParam = dict[key];

            if (null != mergedParam)
            {
                CompiledCommandParameter compiledParam = mergedParam.Parameter;
                if (null != compiledParam)
                {
                    if (!String.IsNullOrEmpty(compiledParam.Name))
                    {
                        return(compiledParam.Name);
                    }
                }
            }
            return(String.Empty);
        }
コード例 #18
0
 private void AddParameter(CompiledCommandParameter parameter, bool checkNames)
 {
     if (checkNames)
     {
         this.CheckForReservedParameter(parameter.Name);
     }
     this.bindableParameters.Add(parameter.Name, parameter);
     foreach (string alias in parameter.Aliases)
     {
         if (this.aliasedParameters.ContainsKey(alias))
         {
             throw new MetadataException("AliasDeclaredMultipleTimes", (Exception)null, "DiscoveryExceptions", "AliasDeclaredMultipleTimes", new object[1]
             {
                 (object)alias
             });
         }
         this.aliasedParameters.Add(alias, parameter);
     }
 }
コード例 #19
0
        /// <summary>
        /// Binds the parameters to local variables in the function scope.
        /// </summary>
        /// <param name="name">
        ///     The name of the parameter to bind the value to.
        /// </param>
        /// <param name="value">
        ///     The value to bind to the parameter. It should be assumed by
        ///     derived classes that the proper type coercion has already taken
        ///     place and that any prerequisite metadata has been satisfied.
        /// </param>
        /// <param name="parameterMetadata"></param>
        internal override void BindParameter(string name, object value, CompiledCommandParameter parameterMetadata)
        {
            if (value == AutomationNull.Value || value == UnboundParameter.Value)
            {
                value = null;
            }

            Diagnostics.Assert(name != null, "The caller should verify that name is not null");

            var varPath = new VariablePath(name, VariablePathFlags.Variable);

            // If the parameter was allocated in the LocalsTuple, we can avoid creating a PSVariable,
            if (LocalScope != null &&
                varPath.IsAnyLocal() &&
                LocalScope.TrySetLocalParameterValue(varPath.UnqualifiedPath, CopyMutableValues(value)))
            {
                return;
            }

            // Otherwise we'll fall through and enter a new PSVariable in the current scope.  This
            // is what normally happens when dotting (though the above may succeed if a parameter name
            // was an automatic variable like $PSBoundParameters.

            // First we need to make a variable instance and apply
            // any attributes from the script.

            PSVariable variable = new PSVariable(varPath.UnqualifiedPath, value,
                                                 varPath.IsPrivate ? ScopedItemOptions.Private : ScopedItemOptions.None);

            Context.EngineSessionState.SetVariable(varPath, variable, false, CommandOrigin.Internal);
            RuntimeDefinedParameter runtimeDefinedParameter;

            if (Script.RuntimeDefinedParameters.TryGetValue(name, out runtimeDefinedParameter))
            {
                // The attributes have already been checked and conversions run, so it is wrong
                // to do so again.
                variable.AddParameterAttributesNoChecks(runtimeDefinedParameter.Attributes);
            }
        }
コード例 #20
0
 internal void Initialize(CompiledCommandParameter compiledParameterMD)
 {
     this.name          = compiledParameterMD.Name;
     this.parameterType = compiledParameterMD.Type;
     this.isDynamic     = compiledParameterMD.IsDynamic;
     this.parameterSets = new Dictionary <string, ParameterSetMetadata>(StringComparer.OrdinalIgnoreCase);
     foreach (string str in compiledParameterMD.ParameterSetData.Keys)
     {
         ParameterSetSpecificMetadata psMD = compiledParameterMD.ParameterSetData[str];
         this.parameterSets.Add(str, new ParameterSetMetadata(psMD));
     }
     this.aliases = new Collection <string>();
     foreach (string str2 in compiledParameterMD.Aliases)
     {
         this.aliases.Add(str2);
     }
     this.attributes = new Collection <Attribute>();
     foreach (Attribute attribute in compiledParameterMD.CompiledAttributes)
     {
         this.attributes.Add(attribute);
     }
 }
コード例 #21
0
        private void BuildSyntaxForParameterSet(XmlElement command, XmlElement syntax, MergedCommandParameterMetadata parameterMetadata, int i)
        {
            XmlElement newChild = this.doc.CreateElement("command:syntaxItem", commandURI);
            XmlElement element2 = this.doc.CreateElement("maml:name", mamlURI);
            XmlText    text     = this.doc.CreateTextNode(this.commandName);

            newChild.AppendChild(element2).AppendChild(text);
            foreach (MergedCompiledCommandParameter parameter in parameterMetadata.GetParametersInParameterSet(((int)1) << i))
            {
                if (parameter.BinderAssociation != ParameterBinderAssociation.CommonParameters)
                {
                    CompiledCommandParameter     parameter2       = parameter.Parameter;
                    ParameterSetSpecificMetadata parameterSetData = parameter2.GetParameterSetData(((int)1) << i);
                    string parameterDescription = this.GetParameterDescription(parameter2.Name);
                    bool   supportsWildcards    = (from attribute in parameter2.CompiledAttributes
                                                   where attribute is SupportsWildcardsAttribute
                                                   select attribute).Any <System.Attribute>();
                    XmlElement element3 = this.BuildXmlForParameter(parameter2.Name, parameterSetData.IsMandatory, parameterSetData.ValueFromPipeline, parameterSetData.ValueFromPipelineByPropertyName, parameterSetData.IsPositional ? ((1 + parameterSetData.Position)).ToString(CultureInfo.InvariantCulture) : "named", parameter2.Type, parameterDescription, supportsWildcards, "", true);
                    newChild.AppendChild(element3);
                }
            }
            command.AppendChild(syntax).AppendChild(newChild);
        }
コード例 #22
0
 private void ValidatePSTypeName(CommandParameterInternal parameter, CompiledCommandParameter parameterMetadata, bool retryOtherBindingAfterFailure, object parameterValue)
 {
     if (parameterValue != null)
     {
         IEnumerable <string> internalTypeNames = PSObject.AsPSObject(parameterValue).InternalTypeNames;
         string pSTypeName = parameterMetadata.PSTypeName;
         if (!internalTypeNames.Contains <string>(pSTypeName, StringComparer.OrdinalIgnoreCase))
         {
             ParameterBindingException exception2;
             object[] arguments = new object[] { ((this.invocationInfo != null) && (this.invocationInfo.MyCommand != null)) ? this.invocationInfo.MyCommand.Name : string.Empty, parameterMetadata.Name, parameterMetadata.Type, parameterValue.GetType(), 0, 0, pSTypeName };
             PSInvalidCastException innerException = new PSInvalidCastException(ErrorCategory.InvalidArgument.ToString(), null, ResourceManagerCache.GetResourceString("ParameterBinderStrings", "MismatchedPSTypeName"), arguments);
             if (!retryOtherBindingAfterFailure)
             {
                 exception2 = new ParameterBindingArgumentTransformationException(innerException, ErrorCategory.InvalidArgument, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, parameterValue.GetType(), "ParameterBinderStrings", "MismatchedPSTypeName", new object[] { pSTypeName });
             }
             else
             {
                 exception2 = new ParameterBindingException(innerException, ErrorCategory.InvalidArgument, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, parameterValue.GetType(), "ParameterBinderStrings", "MismatchedPSTypeName", new object[] { pSTypeName });
             }
             throw exception2;
         }
     }
 }
コード例 #23
0
        private int AddParameterSetToMap(string parameterSetName, CompiledCommandParameter parameter)
        {
            int num = -1;

            if (!string.IsNullOrEmpty(parameterSetName))
            {
                num = this.parameterSetMap.IndexOf(parameterSetName);
                if (num == -1)
                {
                    if (this.nextAvailableParameterSetIndex == uint.MaxValue)
                    {
                        ParsingMetadataException metadataException = new ParsingMetadataException("ParsingTooManyParameterSets", (Exception)null, "Metadata", "ParsingTooManyParameterSets", new object[0]);
                        MergedCommandParameterMetadata.tracer.TraceException((Exception)metadataException);
                        throw metadataException;
                    }
                    this.parameterSetMap.Add(parameterSetName);
                    num = this.parameterSetMap.IndexOf(parameterSetName);
                    ++this.nextAvailableParameterSetIndex;
                }
                MergedCommandParameterMetadata.tracer.WriteLine("ParameterSet: {0} Added At: {1}", (object)parameterSetName, (object)num);
            }
            return(num);
        }
コード例 #24
0
        private void AddParameter(MemberInfo member, bool processingDynamicParameters)
        {
            bool flag  = false;
            bool flag2 = false;

            this.CheckForReservedParameter(member.Name);
            if (this.bindableParameters.ContainsKey(member.Name))
            {
                CompiledCommandParameter parameter = this.bindableParameters[member.Name];
                Type declaringType = parameter.DeclaringType;
                if (declaringType == null)
                {
                    flag = true;
                }
                else if (declaringType.IsSubclassOf(member.DeclaringType))
                {
                    flag2 = true;
                }
                else if (member.DeclaringType.IsSubclassOf(declaringType))
                {
                    this.RemoveParameter(parameter);
                }
                else
                {
                    flag = true;
                }
            }
            if (flag)
            {
                throw new System.Management.Automation.MetadataException("DuplicateParameterDefinition", null, ParameterBinderStrings.DuplicateParameterDefinition, new object[] { member.Name });
            }
            if (!flag2)
            {
                CompiledCommandParameter parameter2 = new CompiledCommandParameter(member, processingDynamicParameters);
                this.AddParameter(parameter2, true);
            }
        }
コード例 #25
0
        private void BuildSyntaxForParameterSet(
            XmlElement command,
            XmlElement syntax,
            MergedCommandParameterMetadata parameterMetadata,
            int i)
        {
            XmlElement element1 = this.doc.CreateElement("command:syntaxItem", HelpCommentsParser.commandURI);
            XmlElement element2 = this.doc.CreateElement("maml:name", HelpCommentsParser.mamlURI);
            XmlText    textNode = this.doc.CreateTextNode(this.commandName);

            element1.AppendChild((XmlNode)element2).AppendChild((XmlNode)textNode);
            foreach (MergedCompiledCommandParameter parametersInParameter in parameterMetadata.GetParametersInParameterSet((uint)(1 << i)))
            {
                if (parametersInParameter.BinderAssociation != ParameterBinderAssociation.CommonParameters)
                {
                    CompiledCommandParameter     parameter        = parametersInParameter.Parameter;
                    ParameterSetSpecificMetadata parameterSetData = parameter.GetParameterSetData((uint)(1 << i));
                    string     parameterDescription = this.GetParameterDescription(parameter.Name);
                    XmlElement xmlElement           = this.BuildXmlForParameter(parameter.Name, parameterSetData.IsMandatory, parameterSetData.ValueFromPipeline, parameterSetData.ValueFromPipelineByPropertyName, parameterSetData.IsPositional ? (1 + parameterSetData.Position).ToString((IFormatProvider)CultureInfo.InvariantCulture) : "named", parameter.Type, parameterDescription, true);
                    element1.AppendChild((XmlNode)xmlElement);
                }
            }
            command.AppendChild((XmlNode)syntax).AppendChild((XmlNode)element1);
        }
コード例 #26
0
ファイル: TypeMetadata.cs プロジェクト: dfinke/powershell
        /// <summary>
        /// Fills in the data for an instance of this class using the specified runtime-defined parameters
        /// </summary>
        /// 
        /// <param name="runtimeDefinedParameters">
        /// A description of the parameters and their metadata.
        /// </param>
        /// 
        /// <param name="processingDynamicParameters">
        /// True if dynamic parameters are being processed, or false otherwise.
        /// </param>
        /// 
        /// <param name="checkNames">
        /// Check if the parameter name has been reserved.
        /// </param>
        /// 
        /// <exception cref="MetadataException">
        /// If a parameter defines the same parameter-set name multiple times.
        /// If the attributes could not be read from a property or field.
        /// </exception>
        /// 
        private void ConstructCompiledParametersUsingRuntimeDefinedParameters(
            RuntimeDefinedParameterDictionary runtimeDefinedParameters,
            bool processingDynamicParameters,
            bool checkNames)
        {
            Diagnostics.Assert(
                runtimeDefinedParameters != null,
                "This method should only be called when constructed with a valid runtime-defined parameter collection");

            foreach (RuntimeDefinedParameter parameterDefinition in runtimeDefinedParameters.Values)
            {
                // Create the compiled parameter and add it to the bindable parameters collection

                // NTRAID#Windows Out Of Band Releases-926374-2005/12/22-JonN
                if (null == parameterDefinition)
                    continue;

                CompiledCommandParameter parameter = new CompiledCommandParameter(parameterDefinition, processingDynamicParameters);
                AddParameter(parameter, checkNames);
            }
        } // ConstructCompiledParametersUsingRuntimeDefinedParameters
コード例 #27
0
 private bool PrepareCommandElements(ExecutionContext context)
 {
     int num = 0;
     bool dotSource = this._commandAst.InvocationOperator == TokenKind.Dot;
     CommandProcessorBase base2 = null;
     string resolvedCommandName = null;
     bool flag2 = false;
     try
     {
         base2 = this.PrepareFromAst(context, out resolvedCommandName) ?? context.CreateCommand(resolvedCommandName, dotSource);
     }
     catch (RuntimeException exception)
     {
         CommandProcessorBase.CheckForSevereException(exception);
         if ((this._commandAst.IsInWorkflow() && (resolvedCommandName != null)) && CompletionCompleters.PseudoWorkflowCommands.Contains<string>(resolvedCommandName, StringComparer.OrdinalIgnoreCase))
         {
             flag2 = true;
         }
         else
         {
             return false;
         }
     }
     CommandProcessor commandProcessor = base2 as CommandProcessor;
     ScriptCommandProcessorBase base3 = base2 as ScriptCommandProcessorBase;
     bool flag3 = (commandProcessor != null) && commandProcessor.CommandInfo.ImplementsDynamicParameters;
     List<object> list = flag3 ? new List<object>(this._commandElements.Count) : null;
     if (((commandProcessor != null) || (base3 != null)) || flag2)
     {
         num++;
         while (num < this._commandElements.Count)
         {
             CommandParameterAst parameterAst = this._commandElements[num] as CommandParameterAst;
             if (parameterAst != null)
             {
                 if (list != null)
                 {
                     list.Add(parameterAst.Extent.Text);
                 }
                 AstPair item = (parameterAst.Argument != null) ? new AstPair(parameterAst, parameterAst.Argument) : new AstPair(parameterAst);
                 this._arguments.Add(item);
             }
             else
             {
                 StringConstantExpressionAst ast2 = this._commandElements[num] as StringConstantExpressionAst;
                 if ((ast2 == null) || !ast2.Value.Trim().Equals("-", StringComparison.OrdinalIgnoreCase))
                 {
                     ExpressionAst argumentAst = this._commandElements[num] as ExpressionAst;
                     if (argumentAst != null)
                     {
                         if (list != null)
                         {
                             list.Add(argumentAst.Extent.Text);
                         }
                         this._arguments.Add(new AstPair(null, argumentAst));
                     }
                 }
             }
             num++;
         }
     }
     if (commandProcessor != null)
     {
         this._function = false;
         if (flag3)
         {
             ParameterBinderController.AddArgumentsToCommandProcessor(commandProcessor, list.ToArray());
             bool flag4 = false;
             bool flag5 = false;
             do
             {
                 CommandProcessorBase currentCommandProcessor = context.CurrentCommandProcessor;
                 try
                 {
                     context.CurrentCommandProcessor = commandProcessor;
                     commandProcessor.SetCurrentScopeToExecutionScope();
                     if (!flag4)
                     {
                         commandProcessor.CmdletParameterBinderController.BindCommandLineParametersNoValidation(commandProcessor.arguments);
                     }
                     else
                     {
                         flag5 = true;
                         commandProcessor.CmdletParameterBinderController.ClearUnboundArguments();
                         commandProcessor.CmdletParameterBinderController.BindCommandLineParametersNoValidation(new Collection<CommandParameterInternal>());
                     }
                 }
                 catch (ParameterBindingException exception2)
                 {
                     if ((exception2.ErrorId == "MissingArgument") || (exception2.ErrorId == "AmbiguousParameter"))
                     {
                         flag4 = true;
                     }
                 }
                 catch (Exception exception3)
                 {
                     CommandProcessorBase.CheckForSevereException(exception3);
                 }
                 finally
                 {
                     context.CurrentCommandProcessor = currentCommandProcessor;
                     commandProcessor.RestorePreviousScope();
                 }
             }
             while (flag4 && !flag5);
         }
         this._commandInfo = commandProcessor.CommandInfo;
         this._commandName = commandProcessor.CommandInfo.Name;
         this._bindableParameters = commandProcessor.CmdletParameterBinderController.BindableParameters;
         this._defaultParameterSetFlag = commandProcessor.CommandInfo.CommandMetadata.DefaultParameterSetFlag;
     }
     else if (base3 != null)
     {
         this._function = true;
         this._commandInfo = base3.CommandInfo;
         this._commandName = base3.CommandInfo.Name;
         this._bindableParameters = base3.ScriptParameterBinderController.BindableParameters;
         this._defaultParameterSetFlag = 0;
     }
     else if (!flag2)
     {
         return false;
     }
     if (this._commandAst.IsInWorkflow())
     {
         Type type = Type.GetType("Microsoft.PowerShell.Workflow.AstToWorkflowConverter, Microsoft.PowerShell.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
         if (type != null)
         {
             Dictionary<string, Type> dictionary = (Dictionary<string, Type>) type.GetMethod("GetActivityParameters").Invoke(null, new object[] { this._commandAst });
             if (dictionary != null)
             {
                 bool flag6 = dictionary.ContainsKey("PSComputerName") && !dictionary.ContainsKey("ComputerName");
                 List<MergedCompiledCommandParameter> source = new List<MergedCompiledCommandParameter>();
                 Collection<Attribute> attributes = new Collection<Attribute> {
                     new ParameterAttribute()
                 };
                 foreach (KeyValuePair<string, Type> pair2 in dictionary)
                 {
                     if (flag2 || !this._bindableParameters.BindableParameters.ContainsKey(pair2.Key))
                     {
                         Type actualActivityParameterType = GetActualActivityParameterType(pair2.Value);
                         RuntimeDefinedParameter runtimeDefinedParameter = new RuntimeDefinedParameter(pair2.Key, actualActivityParameterType, attributes);
                         CompiledCommandParameter parameter = new CompiledCommandParameter(runtimeDefinedParameter, false) {
                             IsInAllSets = true
                         };
                         MergedCompiledCommandParameter parameter3 = new MergedCompiledCommandParameter(parameter, ParameterBinderAssociation.DeclaredFormalParameters);
                         source.Add(parameter3);
                     }
                 }
                 if (source.Any<MergedCompiledCommandParameter>())
                 {
                     MergedCommandParameterMetadata metadata = new MergedCommandParameterMetadata();
                     if (!flag2)
                     {
                         metadata.ReplaceMetadata(this._bindableParameters);
                     }
                     foreach (MergedCompiledCommandParameter parameter5 in source)
                     {
                         metadata.BindableParameters.Add(parameter5.Parameter.Name, parameter5);
                     }
                     this._bindableParameters = metadata;
                 }
                 foreach (string str2 in ignoredWorkflowParameters)
                 {
                     if (this._bindableParameters.BindableParameters.ContainsKey(str2))
                     {
                         this._bindableParameters.BindableParameters.Remove(str2);
                     }
                 }
                 if (this._bindableParameters.BindableParameters.ContainsKey("ComputerName") && flag6)
                 {
                     this._bindableParameters.BindableParameters.Remove("ComputerName");
                     string key = (from aliasPair in this._bindableParameters.AliasedParameters
                         where string.Equals("ComputerName", aliasPair.Value.Parameter.Name)
                         select aliasPair.Key).FirstOrDefault<string>();
                     this._bindableParameters.AliasedParameters.Remove(key);
                 }
             }
         }
     }
     this._unboundParameters.AddRange(this._bindableParameters.BindableParameters.Values);
     CommandBaseAst ast4 = null;
     PipelineAst parent = this._commandAst.Parent as PipelineAst;
     if (parent.PipelineElements.Count > 1)
     {
         foreach (CommandBaseAst ast6 in parent.PipelineElements)
         {
             if (ast6.GetHashCode() == this._commandAst.GetHashCode())
             {
                 this._isPipelineInputExpected = ast4 != null;
                 if (this._isPipelineInputExpected)
                 {
                     this._pipelineInputType = typeof(object);
                 }
                 break;
             }
             ast4 = ast6;
         }
     }
     return true;
 }
コード例 #28
0
        } // ReparseUnboundArgumentsForBinder

        private static bool IsSwitchAndSetValue(
            String argumentName,
            CommandParameterInternal argument,
            CompiledCommandParameter matchingParameter)
        {
            bool result = false;

            if (matchingParameter.Type == typeof(SwitchParameter))
            {
                argument.ParameterName = argumentName;
                argument.SetArgumentValue(PositionUtilities.EmptyExtent, SwitchParameter.Present);
                result = true;
            }

            return result;
        } // EnsureBoolOrSwitchAndSetValue
コード例 #29
0
        internal XmlDocument BuildXmlFromComments()
        {
            this.doc = new XmlDocument();
            XmlElement newChild = this.doc.CreateElement("command:command", commandURI);

            newChild.SetAttribute("xmlns:maml", mamlURI);
            newChild.SetAttribute("xmlns:command", commandURI);
            newChild.SetAttribute("xmlns:dev", devURI);
            this.doc.AppendChild(newChild);
            XmlElement element2 = this.doc.CreateElement("command:details", commandURI);

            newChild.AppendChild(element2);
            XmlElement element3 = this.doc.CreateElement("command:name", commandURI);
            XmlText    text     = this.doc.CreateTextNode(this.commandName);

            element2.AppendChild(element3).AppendChild(text);
            if (!string.IsNullOrEmpty(this._sections.Synopsis))
            {
                XmlElement element4 = this.doc.CreateElement("maml:description", mamlURI);
                XmlElement element5 = this.doc.CreateElement("maml:para", mamlURI);
                XmlText    text2    = this.doc.CreateTextNode(this._sections.Synopsis);
                element2.AppendChild(element4).AppendChild(element5).AppendChild(text2);
            }
            this.DetermineParameterDescriptions();
            XmlElement syntax = this.doc.CreateElement("command:syntax", commandURI);
            MergedCommandParameterMetadata staticCommandParameterMetadata = this.commandMetadata.StaticCommandParameterMetadata;

            if (staticCommandParameterMetadata.ParameterSetCount > 0)
            {
                for (int i = 0; i < staticCommandParameterMetadata.ParameterSetCount; i++)
                {
                    this.BuildSyntaxForParameterSet(newChild, syntax, staticCommandParameterMetadata, i);
                }
            }
            else
            {
                this.BuildSyntaxForParameterSet(newChild, syntax, staticCommandParameterMetadata, 0x7fffffff);
            }
            XmlElement element7 = this.doc.CreateElement("command:parameters", commandURI);

            foreach (KeyValuePair <string, MergedCompiledCommandParameter> pair in staticCommandParameterMetadata.BindableParameters)
            {
                MergedCompiledCommandParameter parameter = pair.Value;
                if (parameter.BinderAssociation != ParameterBinderAssociation.CommonParameters)
                {
                    ParameterSetSpecificMetadata parameterSetData;
                    string key = pair.Key;
                    string parameterDescription            = this.GetParameterDescription(key);
                    bool   isMandatory                     = false;
                    bool   valueFromPipeline               = false;
                    bool   valueFromPipelineByPropertyName = false;
                    string position = "named";
                    int    num2     = 0;
                    CompiledCommandParameter parameter2 = parameter.Parameter;
                    parameter2.ParameterSetData.TryGetValue("__AllParameterSets", out parameterSetData);
                    while ((parameterSetData == null) && (num2 < 0x20))
                    {
                        parameterSetData = parameter2.GetParameterSetData(((int)1) << num2++);
                    }
                    if (parameterSetData != null)
                    {
                        isMandatory       = parameterSetData.IsMandatory;
                        valueFromPipeline = parameterSetData.ValueFromPipeline;
                        valueFromPipelineByPropertyName = parameterSetData.ValueFromPipelineByPropertyName;
                        position = parameterSetData.IsPositional ? ((1 + parameterSetData.Position)).ToString(CultureInfo.InvariantCulture) : "named";
                    }
                    Collection <System.Attribute> compiledAttributes = parameter2.CompiledAttributes;
                    bool   supportsWildcards = compiledAttributes.OfType <SupportsWildcardsAttribute>().Any <SupportsWildcardsAttribute>();
                    string help = "";
                    object obj2 = null;
                    PSDefaultValueAttribute attribute = compiledAttributes.OfType <PSDefaultValueAttribute>().FirstOrDefault <PSDefaultValueAttribute>();
                    if (attribute != null)
                    {
                        help = attribute.Help;
                        if (string.IsNullOrEmpty(help))
                        {
                            obj2 = attribute.Value;
                        }
                    }
                    if (string.IsNullOrEmpty(help))
                    {
                        RuntimeDefinedParameter parameter3;
                        if ((obj2 == null) && this.scriptBlock.RuntimeDefinedParameters.TryGetValue(key, out parameter3))
                        {
                            obj2 = parameter3.Value;
                        }
                        Compiler.DefaultValueExpressionWrapper wrapper = obj2 as Compiler.DefaultValueExpressionWrapper;
                        if (wrapper != null)
                        {
                            help = wrapper.Expression.Extent.Text;
                        }
                        else if (obj2 != null)
                        {
                            help = PSObject.ToStringParser(null, obj2);
                        }
                    }
                    XmlElement element8 = this.BuildXmlForParameter(key, isMandatory, valueFromPipeline, valueFromPipelineByPropertyName, position, parameter2.Type, parameterDescription, supportsWildcards, help, false);
                    element7.AppendChild(element8);
                }
            }
            newChild.AppendChild(element7);
            if (!string.IsNullOrEmpty(this._sections.Description))
            {
                XmlElement element9  = this.doc.CreateElement("maml:description", mamlURI);
                XmlElement element10 = this.doc.CreateElement("maml:para", mamlURI);
                XmlText    text3     = this.doc.CreateTextNode(this._sections.Description);
                newChild.AppendChild(element9).AppendChild(element10).AppendChild(text3);
            }
            if (!string.IsNullOrEmpty(this._sections.Notes))
            {
                XmlElement element11 = this.doc.CreateElement("maml:alertSet", mamlURI);
                XmlElement element12 = this.doc.CreateElement("maml:alert", mamlURI);
                XmlElement element13 = this.doc.CreateElement("maml:para", mamlURI);
                XmlText    text4     = this.doc.CreateTextNode(this._sections.Notes);
                newChild.AppendChild(element11).AppendChild(element12).AppendChild(element13).AppendChild(text4);
            }
            if (this._examples.Count > 0)
            {
                XmlElement element14 = this.doc.CreateElement("command:examples", commandURI);
                int        num3      = 1;
                foreach (string str5 in this._examples)
                {
                    string     str7;
                    string     str8;
                    string     str9;
                    XmlElement element15 = this.doc.CreateElement("command:example", commandURI);
                    XmlElement element16 = this.doc.CreateElement("maml:title", mamlURI);
                    string     str6      = string.Format(CultureInfo.InvariantCulture, "\t\t\t\t-------------------------- {0} {1} --------------------------", new object[] { HelpDisplayStrings.ExampleUpperCase, num3++ });
                    XmlText    text5     = this.doc.CreateTextNode(str6);
                    element15.AppendChild(element16).AppendChild(text5);
                    GetExampleSections(str5, out str7, out str8, out str9);
                    XmlElement element17 = this.doc.CreateElement("maml:introduction", mamlURI);
                    XmlElement element18 = this.doc.CreateElement("maml:para", mamlURI);
                    XmlText    text6     = this.doc.CreateTextNode(str7);
                    element15.AppendChild(element17).AppendChild(element18).AppendChild(text6);
                    XmlElement element19 = this.doc.CreateElement("dev:code", devURI);
                    XmlText    text7     = this.doc.CreateTextNode(str8);
                    element15.AppendChild(element19).AppendChild(text7);
                    XmlElement element20 = this.doc.CreateElement("dev:remarks", devURI);
                    XmlElement element21 = this.doc.CreateElement("maml:para", mamlURI);
                    XmlText    text8     = this.doc.CreateTextNode(str9);
                    element15.AppendChild(element20).AppendChild(element21).AppendChild(text8);
                    for (int j = 0; j < 4; j++)
                    {
                        element20.AppendChild(this.doc.CreateElement("maml:para", mamlURI));
                    }
                    element14.AppendChild(element15);
                }
                newChild.AppendChild(element14);
            }
            if (this._inputs.Count > 0)
            {
                XmlElement element22 = this.doc.CreateElement("command:inputTypes", commandURI);
                foreach (string str10 in this._inputs)
                {
                    XmlElement element23 = this.doc.CreateElement("command:inputType", commandURI);
                    XmlElement element24 = this.doc.CreateElement("dev:type", devURI);
                    XmlElement element25 = this.doc.CreateElement("maml:name", mamlURI);
                    XmlText    text9     = this.doc.CreateTextNode(str10);
                    element22.AppendChild(element23).AppendChild(element24).AppendChild(element25).AppendChild(text9);
                }
                newChild.AppendChild(element22);
            }
            IEnumerable outputType = null;

            if (this._outputs.Count > 0)
            {
                outputType = this._outputs;
            }
            else if (this.scriptBlock.OutputType.Count > 0)
            {
                outputType = this.scriptBlock.OutputType;
            }
            if (outputType != null)
            {
                XmlElement element26 = this.doc.CreateElement("command:returnValues", commandURI);
                foreach (object obj3 in outputType)
                {
                    XmlElement element27 = this.doc.CreateElement("command:returnValue", commandURI);
                    XmlElement element28 = this.doc.CreateElement("dev:type", devURI);
                    XmlElement element29 = this.doc.CreateElement("maml:name", mamlURI);
                    string     str11     = (obj3 as string) ?? ((PSTypeName)obj3).Name;
                    XmlText    text10    = this.doc.CreateTextNode(str11);
                    element26.AppendChild(element27).AppendChild(element28).AppendChild(element29).AppendChild(text10);
                }
                newChild.AppendChild(element26);
            }
            if (this._links.Count > 0)
            {
                XmlElement element30 = this.doc.CreateElement("maml:relatedLinks", mamlURI);
                foreach (string str12 in this._links)
                {
                    XmlElement element31     = this.doc.CreateElement("maml:navigationLink", mamlURI);
                    string     qualifiedName = Uri.IsWellFormedUriString(Uri.EscapeUriString(str12), UriKind.Absolute) ? "maml:uri" : "maml:linkText";
                    XmlElement element32     = this.doc.CreateElement(qualifiedName, mamlURI);
                    XmlText    text11        = this.doc.CreateTextNode(str12);
                    element30.AppendChild(element31).AppendChild(element32).AppendChild(text11);
                }
                newChild.AppendChild(element30);
            }
            return(this.doc);
        }
コード例 #30
0
 /// <summary>
 /// Constructs an association between the CompiledCommandParameter and the
 /// binder that should be used to bind it.
 /// </summary>
 /// 
 /// <param name="parameter">
 /// The metadata for a parameter.
 /// </param>
 /// 
 /// <param name="binderAssociation">
 /// The type of binder that should be used to bind the parameter.
 /// </param>
 internal MergedCompiledCommandParameter(
         CompiledCommandParameter parameter,
         ParameterBinderAssociation binderAssociation)
 {
     Diagnostics.Assert(parameter != null, "caller to verify parameter is not null");
     this.Parameter = parameter;
     this.BinderAssociation = binderAssociation;
 }
コード例 #31
0
ファイル: TypeMetadata.cs プロジェクト: dfinke/powershell
        /// <summary>
        /// 
        /// </summary>
        /// <param name="compiledParameterMD"></param>
        internal void Initialize(CompiledCommandParameter compiledParameterMD)
        {
            _name = compiledParameterMD.Name;
            _parameterType = compiledParameterMD.Type;
            _isDynamic = compiledParameterMD.IsDynamic;

            // Create parameter set metadata
            _parameterSets = new Dictionary<string, ParameterSetMetadata>(StringComparer.OrdinalIgnoreCase);
            foreach (string key in compiledParameterMD.ParameterSetData.Keys)
            {
                ParameterSetSpecificMetadata pMD = compiledParameterMD.ParameterSetData[key];
                _parameterSets.Add(key, new ParameterSetMetadata(pMD));
            }

            // Create aliases for this parameter
            _aliases = new Collection<string>();
            foreach (string alias in compiledParameterMD.Aliases)
            {
                _aliases.Add(alias);
            }

            // Create attributes for this parameter
            _attributes = new Collection<Attribute>();
            foreach (var attrib in compiledParameterMD.CompiledAttributes)
            {
                _attributes.Add(attrib);
            }
        }
コード例 #32
0
ファイル: TypeMetadata.cs プロジェクト: dfinke/powershell
        private void RemoveParameter(CompiledCommandParameter parameter)
        {
            BindableParameters.Remove(parameter.Name);

            // Now add entries in the parameter aliases collection for any aliases.

            foreach (string alias in parameter.Aliases)
            {
                AliasedParameters.Remove(alias);
            }
        }
コード例 #33
0
 internal MergedCompiledCommandParameter(CompiledCommandParameter parameter, ParameterBinderAssociation binderAssociation)
 {
     this.Parameter         = parameter;
     this.BinderAssociation = binderAssociation;
 }
コード例 #34
0
ファイル: ParameterMetadata.cs プロジェクト: nickchal/pash
 internal void Initialize(CompiledCommandParameter compiledParameterMD)
 {
     this.name = compiledParameterMD.Name;
     this.parameterType = compiledParameterMD.Type;
     this.isDynamic = compiledParameterMD.IsDynamic;
     this.parameterSets = new Dictionary<string, ParameterSetMetadata>(StringComparer.OrdinalIgnoreCase);
     foreach (string str in compiledParameterMD.ParameterSetData.Keys)
     {
         ParameterSetSpecificMetadata psMD = compiledParameterMD.ParameterSetData[str];
         this.parameterSets.Add(str, new ParameterSetMetadata(psMD));
     }
     this.aliases = new Collection<string>();
     foreach (string str2 in compiledParameterMD.Aliases)
     {
         this.aliases.Add(str2);
     }
     this.attributes = new Collection<Attribute>();
     foreach (Attribute attribute in compiledParameterMD.CompiledAttributes)
     {
         this.attributes.Add(attribute);
     }
 }
コード例 #35
0
        } // GetDefaultParameterValue

        #endregion Parameter default values

        /// <summary>
        /// Uses ETS to set the property specified by name to the value on
        /// the target bindable object.
        /// </summary>
        /// <param name="name">
        ///     The name of the parameter to bind the value to.
        /// </param>
        /// <param name="value">
        ///     The value to bind to the parameter. It should be assumed by
        ///     derived classes that the proper type coercion has already taken
        ///     place and that any prerequisite metadata has been satisfied.
        /// </param>
        /// <param name="parameterMetadata"></param>
        /// <exception cref="ArgumentException">
        /// If <paramref name="name"/> is null or empty.
        /// </exception>
        internal override void BindParameter(string name, object value, CompiledCommandParameter parameterMetadata)
        {
            if (String.IsNullOrEmpty(name))
            {
                throw PSTraceSource.NewArgumentException("name");
            }

            Target[name].Value = value;
            this.CommandLineParameters.Add(name, value);
        } // BindParameter
コード例 #36
0
ファイル: ParameterBinderBase.cs プロジェクト: nickchal/pash
 private void ValidatePSTypeName(CommandParameterInternal parameter, CompiledCommandParameter parameterMetadata, bool retryOtherBindingAfterFailure, object parameterValue)
 {
     if (parameterValue != null)
     {
         IEnumerable<string> internalTypeNames = PSObject.AsPSObject(parameterValue).InternalTypeNames;
         string pSTypeName = parameterMetadata.PSTypeName;
         if (!internalTypeNames.Contains<string>(pSTypeName, StringComparer.OrdinalIgnoreCase))
         {
             ParameterBindingException exception2;
             object[] arguments = new object[] { ((this.invocationInfo != null) && (this.invocationInfo.MyCommand != null)) ? this.invocationInfo.MyCommand.Name : string.Empty, parameterMetadata.Name, parameterMetadata.Type, parameterValue.GetType(), 0, 0, pSTypeName };
             PSInvalidCastException innerException = new PSInvalidCastException(ErrorCategory.InvalidArgument.ToString(), null, ResourceManagerCache.GetResourceString("ParameterBinderStrings", "MismatchedPSTypeName"), arguments);
             if (!retryOtherBindingAfterFailure)
             {
                 exception2 = new ParameterBindingArgumentTransformationException(innerException, ErrorCategory.InvalidArgument, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, parameterValue.GetType(), "ParameterBinderStrings", "MismatchedPSTypeName", new object[] { pSTypeName });
             }
             else
             {
                 exception2 = new ParameterBindingException(innerException, ErrorCategory.InvalidArgument, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, parameterValue.GetType(), "ParameterBinderStrings", "MismatchedPSTypeName", new object[] { pSTypeName });
             }
             throw exception2;
         }
     }
 }
コード例 #37
0
        internal virtual bool BindParameter(CommandParameterInternal parameter, CompiledCommandParameter parameterMetadata, ParameterBindingFlags flags)
        {
            bool flag  = false;
            bool flag2 = (flags & ParameterBindingFlags.ShouldCoerceType) != ParameterBindingFlags.None;

            if (parameter == null)
            {
                throw PSTraceSource.NewArgumentNullException("parameter");
            }
            if (parameterMetadata == null)
            {
                throw PSTraceSource.NewArgumentNullException("parameterMetadata");
            }
            using (bindingTracer.TraceScope("BIND arg [{0}] to parameter [{1}]", new object[] { parameter.ArgumentValue, parameterMetadata.Name }))
            {
                parameter.ParameterName = parameterMetadata.Name;
                object argumentValue         = parameter.ArgumentValue;
                ScriptParameterBinder binder = this as ScriptParameterBinder;
                bool bindingScriptCmdlet     = false;
                if (binder != null)
                {
                    bindingScriptCmdlet = binder.Script.UsesCmdletBinding;
                }
                foreach (ArgumentTransformationAttribute attribute in parameterMetadata.ArgumentTransformationAttributes)
                {
                    using (bindingTracer.TraceScope("Executing DATA GENERATION metadata: [{0}]", new object[] { attribute.GetType() }))
                    {
                        try
                        {
                            ArgumentTypeConverterAttribute attribute2 = attribute as ArgumentTypeConverterAttribute;
                            if (attribute2 != null)
                            {
                                if (flag2)
                                {
                                    argumentValue = attribute2.Transform(this.engine, argumentValue, true, bindingScriptCmdlet);
                                }
                            }
                            else
                            {
                                argumentValue = attribute.Transform(this.engine, argumentValue);
                            }
                            bindingTracer.WriteLine("result returned from DATA GENERATION: {0}", new object[] { argumentValue });
                        }
                        catch (Exception exception)
                        {
                            CommandProcessorBase.CheckForSevereException(exception);
                            bindingTracer.WriteLine("ERROR: DATA GENERATION: {0}", new object[] { exception.Message });
                            ParameterBindingException exception2 = new ParameterBindingArgumentTransformationException(exception, ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, (argumentValue == null) ? null : argumentValue.GetType(), "ParameterBinderStrings", "ParameterArgumentTransformationError", new object[] { exception.Message });
                            throw exception2;
                        }
                    }
                }
                if (flag2)
                {
                    argumentValue = this.CoerceTypeAsNeeded(parameter, parameterMetadata.Name, parameterMetadata.Type, parameterMetadata.CollectionTypeInformation, argumentValue);
                }
                else if (!this.ShouldContinueUncoercedBind(parameter, parameterMetadata, flags, ref argumentValue))
                {
                    goto Label_040E;
                }
                if ((parameterMetadata.PSTypeName != null) && (argumentValue != null))
                {
                    IEnumerable enumerable = LanguagePrimitives.GetEnumerable(argumentValue);
                    if (enumerable != null)
                    {
                        foreach (object obj3 in enumerable)
                        {
                            this.ValidatePSTypeName(parameter, parameterMetadata, !flag2, obj3);
                        }
                    }
                    else
                    {
                        this.ValidatePSTypeName(parameter, parameterMetadata, !flag2, argumentValue);
                    }
                }
                if ((flags & ParameterBindingFlags.IsDefaultValue) == ParameterBindingFlags.None)
                {
                    foreach (ValidateArgumentsAttribute attribute3 in parameterMetadata.ValidationAttributes)
                    {
                        using (bindingTracer.TraceScope("Executing VALIDATION metadata: [{0}]", new object[] { attribute3.GetType() }))
                        {
                            try
                            {
                                attribute3.InternalValidate(argumentValue, this.engine);
                            }
                            catch (Exception exception3)
                            {
                                CommandProcessorBase.CheckForSevereException(exception3);
                                bindingTracer.WriteLine("ERROR: VALIDATION FAILED: {0}", new object[] { exception3.Message });
                                ParameterBindingValidationException exception4 = new ParameterBindingValidationException(exception3, ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, (argumentValue == null) ? null : argumentValue.GetType(), "ParameterBinderStrings", "ParameterArgumentValidationError", new object[] { exception3.Message });
                                throw exception4;
                            }
                            tracer.WriteLine("Validation attribute on {0} returned {1}.", new object[] { parameterMetadata.Name, flag });
                        }
                    }
                    if (IsParameterMandatory(parameterMetadata))
                    {
                        this.ValidateNullOrEmptyArgument(parameter, parameterMetadata, parameterMetadata.Type, argumentValue, true);
                    }
                }
                Exception innerException = null;
                try
                {
                    this.BindParameter(parameter.ParameterName, argumentValue);
                    flag = true;
                }
                catch (SetValueException exception6)
                {
                    innerException = exception6;
                }
                if (innerException != null)
                {
                    Type typeSpecified = (argumentValue == null) ? null : argumentValue.GetType();
                    ParameterBindingException exception7 = new ParameterBindingException(innerException, ErrorCategory.WriteError, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, typeSpecified, "ParameterBinderStrings", "ParameterBindingFailed", new object[] { innerException.Message });
                    throw exception7;
                }
                Label_040E :;
                bindingTracer.WriteLine("BIND arg [{0}] to param [{1}] {2}", new object[] { argumentValue, parameter.ParameterName, flag ? "SUCCESSFUL" : "SKIPPED" });
                if (flag)
                {
                    if (this.RecordBoundParameters)
                    {
                        this.CommandLineParameters.Add(parameter.ParameterName, argumentValue);
                    }
                    MshCommandRuntime commandRuntime = this.Command.commandRuntime as MshCommandRuntime;
                    if ((commandRuntime != null) && commandRuntime.LogPipelineExecutionDetail)
                    {
                        IEnumerable source = LanguagePrimitives.GetEnumerable(argumentValue);
                        if (source != null)
                        {
                            string parameterValue = string.Join(", ", source.Cast <object>().ToArray <object>());
                            commandRuntime.PipelineProcessor.LogExecutionParameterBinding(this.InvocationInfo, parameter.ParameterName, parameterValue);
                        }
                        else
                        {
                            commandRuntime.PipelineProcessor.LogExecutionParameterBinding(this.InvocationInfo, parameter.ParameterName, (argumentValue == null) ? "" : argumentValue.ToString());
                        }
                    }
                }
                return(flag);
            }
        }
コード例 #38
0
 internal MergedCompiledCommandParameter(CompiledCommandParameter parameter, ParameterBinderAssociation binderAssociation)
 {
     this.Parameter = parameter;
     this.BinderAssociation = binderAssociation;
 }
コード例 #39
0
        /// <summary>
        /// Binds a parameter for a native command (application).
        /// </summary>
        /// <param name="name">
        ///     The name of the parameter to bind the value to. For applications
        ///     this just becomes another parameter...
        /// </param>
        /// <param name="value">
        ///     The value to bind to the parameter. It should be assumed by
        ///     derived classes that the proper type coercion has already taken
        ///     place and that any prerequisite metadata has been satisfied.
        /// </param>
        /// <param name="parameterMetadata"></param>
        internal override void BindParameter(string name, object value, CompiledCommandParameter parameterMetadata)
        {
            Diagnostics.Assert(false, "Unreachable code");

            throw new NotSupportedException();
        } // BindParameter
コード例 #40
0
ファイル: TypeMetadata.cs プロジェクト: dfinke/powershell
        // NTRAID#Windows Out Of Band Releases-906345-2005/06/30-JeffJon
        // This call verifies that the parameter is unique or 
        // can be deemed unique. If not, an exception is thrown.
        // If it is unique (or deemed unique), then it is added
        // to the bindableParameters collection
        //
        private void AddParameter(MemberInfo member, bool processingDynamicParameters)
        {
            bool error = false;
            bool useExisting = false;

            CheckForReservedParameter(member.Name);

            do // false loop
            {
                CompiledCommandParameter existingParameter;
                if (!BindableParameters.TryGetValue(member.Name, out existingParameter))
                {
                    break;
                }

                Type existingParamDeclaringType = existingParameter.DeclaringType;

                if (existingParamDeclaringType == null)
                {
                    error = true;
                    break;
                }

                if (existingParamDeclaringType.IsSubclassOf(member.DeclaringType))
                {
                    useExisting = true;
                    break;
                }

                if (member.DeclaringType.IsSubclassOf(existingParamDeclaringType))
                {
                    // Need to swap out the new member for the parameter definition
                    // that is already defined.

                    RemoveParameter(existingParameter);
                    break;
                }

                error = true;
            } while (false);

            if (error)
            {
                // A duplicate parameter was found and could not be deemed unique 
                // through inheritance. 

                throw new MetadataException(
                    "DuplicateParameterDefinition",
                    null,
                    ParameterBinderStrings.DuplicateParameterDefinition,
                    member.Name);
            }

            if (!useExisting)
            {
                CompiledCommandParameter parameter = new CompiledCommandParameter(member, processingDynamicParameters);
                AddParameter(parameter, true);
            }
        }
コード例 #41
0
ファイル: TypeMetadata.cs プロジェクト: dfinke/powershell
        private void AddParameter(CompiledCommandParameter parameter, bool checkNames)
        {
            if (checkNames)
            {
                CheckForReservedParameter(parameter.Name);
            }

            BindableParameters.Add(parameter.Name, parameter);

            // Now add entries in the parameter aliases collection for any aliases.

            foreach (string alias in parameter.Aliases)
            {
                // NTRAID#Windows Out Of Band Releases-917356-JonN
                if (AliasedParameters.ContainsKey(alias))
                {
                    throw new MetadataException(
                            "AliasDeclaredMultipleTimes",
                            null,
                            DiscoveryExceptions.AliasDeclaredMultipleTimes,
                            alias);
                }
                AliasedParameters.Add(alias, parameter);
            }
        }
コード例 #42
0
        /// <summary>
        /// Binds the parameters to local variables in the function scope
        /// </summary>
        /// <param name="name">
        ///     The name of the parameter to bind the value to.
        /// </param>
        /// <param name="value">
        ///     The value to bind to the parameter. It should be assumed by
        ///     derived classes that the proper type coercion has already taken
        ///     place and that any prerequisite metadata has been satisfied.
        /// </param>
        /// <param name="parameterMetadata"></param>
        internal override void BindParameter(string name, object value, CompiledCommandParameter parameterMetadata)
        {
            if (value == AutomationNull.Value || value == UnboundParameter.Value)
            {
                value = null;
            }

            Diagnostics.Assert(name != null, "The caller should verify that name is not null");

            var varPath = new VariablePath(name, VariablePathFlags.Variable);

            // If the parameter was allocated in the LocalsTuple, we can avoid creating a PSVariable,
            if (LocalScope != null
                && varPath.IsAnyLocal()
                && LocalScope.TrySetLocalParameterValue(varPath.UnqualifiedPath, CopyMutableValues(value)))
            {
                return;
            }

            // Otherwise we'll fall through and enter a new PSVariable in the current scope.  This
            // is what normally happens when dotting (though the above may succeed if a parameter name
            // was an automatic variable like $PSBoundParameters.

            // First we need to make a variable instance and apply
            // any attributes from the script.

            PSVariable variable = new PSVariable(varPath.UnqualifiedPath, value,
                                                 varPath.IsPrivate ? ScopedItemOptions.Private : ScopedItemOptions.None);
            Context.EngineSessionState.SetVariable(varPath, variable, false, CommandOrigin.Internal);
            RuntimeDefinedParameter runtimeDefinedParameter;
            if (Script.RuntimeDefinedParameters.TryGetValue(name, out runtimeDefinedParameter))
            {
                // The attributes have already been checked and conversions run, so it is wrong
                // to do so again.
                variable.AddParameterAttributesNoChecks(runtimeDefinedParameter.Attributes);
            }
        } // BindParameter
コード例 #43
0
ファイル: TypeMetadata.cs プロジェクト: dfinke/powershell
        /// <summary>
        /// An internal constructor which constructs a ParameterMetadata object
        /// from compiled command parameter metadata. ParameterMetadata
        /// is a proxy written on top of CompiledCommandParameter
        /// </summary>
        /// <param name="cmdParameterMD">
        /// Internal CompiledCommandParameter metadata
        /// </param>
        internal ParameterMetadata(CompiledCommandParameter cmdParameterMD)
        {
            Dbg.Assert(null != cmdParameterMD,
                "CompiledCommandParameter cannot be null");

            Initialize(cmdParameterMD);
        }
コード例 #44
0
        internal XmlDocument BuildXmlFromComments()
        {
            this.doc = new XmlDocument();
            XmlElement element1 = this.doc.CreateElement("command:command", HelpCommentsParser.commandURI);

            element1.SetAttribute("xmlns:maml", HelpCommentsParser.mamlURI);
            element1.SetAttribute("xmlns:command", HelpCommentsParser.commandURI);
            element1.SetAttribute("xmlns:dev", HelpCommentsParser.devURI);
            this.doc.AppendChild((XmlNode)element1);
            XmlElement element2 = this.doc.CreateElement("command:details", HelpCommentsParser.commandURI);

            element1.AppendChild((XmlNode)element2);
            XmlElement element3  = this.doc.CreateElement("command:name", HelpCommentsParser.commandURI);
            XmlText    textNode1 = this.doc.CreateTextNode(this.commandName);

            element2.AppendChild((XmlNode)element3).AppendChild((XmlNode)textNode1);
            if (!string.IsNullOrEmpty(this.sections.synopsis))
            {
                XmlElement element4  = this.doc.CreateElement("maml:description", HelpCommentsParser.mamlURI);
                XmlElement element5  = this.doc.CreateElement("maml:para", HelpCommentsParser.mamlURI);
                XmlText    textNode2 = this.doc.CreateTextNode(this.sections.synopsis);
                element2.AppendChild((XmlNode)element4).AppendChild((XmlNode)element5).AppendChild((XmlNode)textNode2);
            }
            this.DetermineParameterDescriptions();
            XmlElement element6 = this.doc.CreateElement("command:syntax", HelpCommentsParser.commandURI);
            MergedCommandParameterMetadata parameterMetadata = this.commandMetadata.StaticCommandParameterMetadata;

            if (parameterMetadata.ParameterSetCount > 0)
            {
                for (int i = 0; i < parameterMetadata.ParameterSetCount; ++i)
                {
                    this.BuildSyntaxForParameterSet(element1, element6, parameterMetadata, i);
                }
            }
            else
            {
                this.BuildSyntaxForParameterSet(element1, element6, parameterMetadata, int.MaxValue);
            }
            XmlElement element7 = this.doc.CreateElement("command:parameters", HelpCommentsParser.commandURI);

            foreach (KeyValuePair <string, MergedCompiledCommandParameter> bindableParameter in parameterMetadata.BindableParameters)
            {
                MergedCompiledCommandParameter commandParameter = bindableParameter.Value;
                if (commandParameter.BinderAssociation != ParameterBinderAssociation.CommonParameters)
                {
                    string key = bindableParameter.Key;
                    string parameterDescription = this.GetParameterDescription(key);
                    ParameterSetSpecificMetadata specificMetadata = (ParameterSetSpecificMetadata)null;
                    bool   isMandatory       = false;
                    bool   valueFromPipeline = false;
                    bool   valueFromPipelineByPropertyName = false;
                    string position = "named";
                    int    num      = 0;
                    CompiledCommandParameter parameter = commandParameter.Parameter;
                    parameter.ParameterSetData.TryGetValue("__AllParameterSets", out specificMetadata);
                    while (specificMetadata == null && num < 32)
                    {
                        specificMetadata = parameter.GetParameterSetData((uint)(1 << num++));
                    }
                    if (specificMetadata != null)
                    {
                        isMandatory       = specificMetadata.IsMandatory;
                        valueFromPipeline = specificMetadata.ValueFromPipeline;
                        valueFromPipelineByPropertyName = specificMetadata.ValueFromPipelineByPropertyName;
                        position = specificMetadata.IsPositional ? (1 + specificMetadata.Position).ToString((IFormatProvider)CultureInfo.InvariantCulture) : "named";
                    }
                    XmlElement xmlElement = this.BuildXmlForParameter(key, isMandatory, valueFromPipeline, valueFromPipelineByPropertyName, position, parameter.Type, parameterDescription, false);
                    element7.AppendChild((XmlNode)xmlElement);
                }
            }
            element1.AppendChild((XmlNode)element7);
            if (!string.IsNullOrEmpty(this.sections.description))
            {
                XmlElement element4  = this.doc.CreateElement("maml:description", HelpCommentsParser.mamlURI);
                XmlElement element5  = this.doc.CreateElement("maml:para", HelpCommentsParser.mamlURI);
                XmlText    textNode2 = this.doc.CreateTextNode(this.sections.description);
                element1.AppendChild((XmlNode)element4).AppendChild((XmlNode)element5).AppendChild((XmlNode)textNode2);
            }
            if (!string.IsNullOrEmpty(this.sections.notes))
            {
                XmlElement element4  = this.doc.CreateElement("maml:alertSet", HelpCommentsParser.mamlURI);
                XmlElement element5  = this.doc.CreateElement("maml:alert", HelpCommentsParser.mamlURI);
                XmlElement element8  = this.doc.CreateElement("maml:para", HelpCommentsParser.mamlURI);
                XmlText    textNode2 = this.doc.CreateTextNode(this.sections.notes);
                element1.AppendChild((XmlNode)element4).AppendChild((XmlNode)element5).AppendChild((XmlNode)element8).AppendChild((XmlNode)textNode2);
            }
            if (this.sections.examples.Count > 0)
            {
                XmlElement element4 = this.doc.CreateElement("command:examples", HelpCommentsParser.commandURI);
                int        num      = 1;
                foreach (string example in this.sections.examples)
                {
                    XmlElement element5  = this.doc.CreateElement("command:example", HelpCommentsParser.commandURI);
                    XmlElement element8  = this.doc.CreateElement("maml:title", HelpCommentsParser.mamlURI);
                    XmlText    textNode2 = this.doc.CreateTextNode(string.Format((IFormatProvider)CultureInfo.InvariantCulture, "\t\t\t\t-------------------------- {0} {1} --------------------------", (object)ResourceManagerCache.GetResourceString("HelpDisplayStrings", "ExampleUpperCase"), (object)num++));
                    element5.AppendChild((XmlNode)element8).AppendChild((XmlNode)textNode2);
                    string prompt_str;
                    string code_str;
                    string remarks_str;
                    this.GetExampleSections(example, out prompt_str, out code_str, out remarks_str);
                    XmlElement element9  = this.doc.CreateElement("maml:introduction", HelpCommentsParser.mamlURI);
                    XmlElement element10 = this.doc.CreateElement("maml:para", HelpCommentsParser.mamlURI);
                    XmlText    textNode3 = this.doc.CreateTextNode(prompt_str);
                    element5.AppendChild((XmlNode)element9).AppendChild((XmlNode)element10).AppendChild((XmlNode)textNode3);
                    XmlElement element11 = this.doc.CreateElement("dev:code", HelpCommentsParser.devURI);
                    XmlText    textNode4 = this.doc.CreateTextNode(code_str);
                    element5.AppendChild((XmlNode)element11).AppendChild((XmlNode)textNode4);
                    XmlElement element12 = this.doc.CreateElement("dev:remarks", HelpCommentsParser.devURI);
                    XmlElement element13 = this.doc.CreateElement("maml:para", HelpCommentsParser.mamlURI);
                    XmlText    textNode5 = this.doc.CreateTextNode(remarks_str);
                    element5.AppendChild((XmlNode)element12).AppendChild((XmlNode)element13).AppendChild((XmlNode)textNode5);
                    for (int index = 0; index < 4; ++index)
                    {
                        element12.AppendChild((XmlNode)this.doc.CreateElement("maml:para", HelpCommentsParser.mamlURI));
                    }
                    element4.AppendChild((XmlNode)element5);
                }
                element1.AppendChild((XmlNode)element4);
            }
            if (this.sections.inputs.Count > 0)
            {
                XmlElement element4 = this.doc.CreateElement("command:inputTypes", HelpCommentsParser.commandURI);
                foreach (string input in this.sections.inputs)
                {
                    XmlElement element5  = this.doc.CreateElement("command:inputType", HelpCommentsParser.commandURI);
                    XmlElement element8  = this.doc.CreateElement("dev:type", HelpCommentsParser.devURI);
                    XmlElement element9  = this.doc.CreateElement("maml:name", HelpCommentsParser.mamlURI);
                    XmlText    textNode2 = this.doc.CreateTextNode(input);
                    element4.AppendChild((XmlNode)element5).AppendChild((XmlNode)element8).AppendChild((XmlNode)element9).AppendChild((XmlNode)textNode2);
                }
                element1.AppendChild((XmlNode)element4);
            }
            IEnumerable enumerable = (IEnumerable)null;

            if (this.sections.outputs.Count > 0)
            {
                enumerable = (IEnumerable)this.sections.outputs;
            }
            else if (this.scriptBlock.OutputType.Count > 0)
            {
                enumerable = (IEnumerable)this.scriptBlock.OutputType;
            }
            if (enumerable != null)
            {
                XmlElement element4 = this.doc.CreateElement("command:returnValues", HelpCommentsParser.commandURI);
                foreach (object obj in enumerable)
                {
                    XmlElement element5 = this.doc.CreateElement("command:returnValue", HelpCommentsParser.commandURI);
                    XmlElement element8 = this.doc.CreateElement("dev:type", HelpCommentsParser.devURI);
                    XmlElement element9 = this.doc.CreateElement("maml:name", HelpCommentsParser.mamlURI);
                    if (!(obj is string text))
                    {
                        text = ((PSTypeName)obj).Name;
                    }
                    XmlText textNode2 = this.doc.CreateTextNode(text);
                    element4.AppendChild((XmlNode)element5).AppendChild((XmlNode)element8).AppendChild((XmlNode)element9).AppendChild((XmlNode)textNode2);
                }
                element1.AppendChild((XmlNode)element4);
            }
            if (this.sections.links.Count > 0)
            {
                XmlElement element4 = this.doc.CreateElement("maml:relatedLinks", HelpCommentsParser.mamlURI);
                foreach (string link in this.sections.links)
                {
                    XmlElement element5  = this.doc.CreateElement("maml:navigationLink", HelpCommentsParser.mamlURI);
                    XmlElement element8  = this.doc.CreateElement(Uri.IsWellFormedUriString(Uri.EscapeUriString(link), UriKind.Absolute) ? "maml:uri" : "maml:linkText", HelpCommentsParser.mamlURI);
                    XmlText    textNode2 = this.doc.CreateTextNode(link);
                    element4.AppendChild((XmlNode)element5).AppendChild((XmlNode)element8).AppendChild((XmlNode)textNode2);
                }
                element1.AppendChild((XmlNode)element4);
            }
            return(this.doc);
        }
コード例 #45
0
 internal ParameterMetadata(CompiledCommandParameter cmdParameterMD)
 {
     this.Initialize(cmdParameterMD);
 }
コード例 #46
0
 private void ConstructCompiledParametersUsingRuntimeDefinedParameters(RuntimeDefinedParameterDictionary runtimeDefinedParameters, bool processingDynamicParameters, bool checkNames)
 {
     foreach (RuntimeDefinedParameter parameter in runtimeDefinedParameters.Values)
     {
         if (parameter != null)
         {
             CompiledCommandParameter parameter2 = new CompiledCommandParameter(parameter, processingDynamicParameters);
             this.AddParameter(parameter2, checkNames);
         }
     }
 }
コード例 #47
0
ファイル: ParameterMetadata.cs プロジェクト: nickchal/pash
 internal ParameterMetadata(CompiledCommandParameter cmdParameterMD)
 {
     this.Initialize(cmdParameterMD);
 }
コード例 #48
0
        /// <summary>
        /// Uses ETS to set the property specified by name to the value on
        /// the target bindable object.
        /// </summary>
        /// <param name="name">
        ///     The name of the parameter to bind the value to.
        /// </param>
        /// <param name="value">
        ///     The value to bind to the parameter. It should be assumed by
        ///     derived classes that the proper type coercion has already taken
        ///     place and that any prerequisite metadata has been satisfied.
        /// </param>
        /// <param name="parameterMetadata"></param>
        /// <exception cref="SetValueException">
        /// If the setter raises an exception.
        /// </exception>
        internal override void BindParameter(string name, object value, CompiledCommandParameter parameterMetadata)
        {
            Diagnostics.Assert(!string.IsNullOrEmpty(name), "caller to verify name parameter");

            try
            {
                var setter = parameterMetadata != null
                    ? (parameterMetadata.Setter ?? (parameterMetadata.Setter = GetSetter(Target.GetType(), name)))
                    : GetSetter(Target.GetType(), name);
                setter(Target, value);
            }
            catch (TargetInvocationException ex)
            {
                Exception inner = ex.InnerException ?? ex;
                throw new SetValueInvocationException("CatchFromBaseAdapterSetValueTI",
                    inner,
                    ExtendedTypeSystem.ExceptionWhenSetting,
                    name, inner.Message);
            }
            catch (SetValueException) { throw; }
            catch (Exception e)
            {
                CommandProcessorBase.CheckForSevereException(e);
                throw new SetValueInvocationException("CatchFromBaseAdapterSetValue",
                    e,
                    ExtendedTypeSystem.ExceptionWhenSetting,
                    name, e.Message);
            }
        } // BindParameter
コード例 #49
0
 private void RemoveParameter(CompiledCommandParameter parameter)
 {
     this.bindableParameters.Remove(parameter.Name);
     foreach (string str in parameter.Aliases)
     {
         this.aliasedParameters.Remove(str);
     }
 }
コード例 #50
0
ファイル: ParameterBinderBase.cs プロジェクト: nickchal/pash
 internal virtual bool BindParameter(CommandParameterInternal parameter, CompiledCommandParameter parameterMetadata, ParameterBindingFlags flags)
 {
     bool flag = false;
     bool flag2 = (flags & ParameterBindingFlags.ShouldCoerceType) != ParameterBindingFlags.None;
     if (parameter == null)
     {
         throw PSTraceSource.NewArgumentNullException("parameter");
     }
     if (parameterMetadata == null)
     {
         throw PSTraceSource.NewArgumentNullException("parameterMetadata");
     }
     using (bindingTracer.TraceScope("BIND arg [{0}] to parameter [{1}]", new object[] { parameter.ArgumentValue, parameterMetadata.Name }))
     {
         parameter.ParameterName = parameterMetadata.Name;
         object argumentValue = parameter.ArgumentValue;
         ScriptParameterBinder binder = this as ScriptParameterBinder;
         bool bindingScriptCmdlet = false;
         if (binder != null)
         {
             bindingScriptCmdlet = binder.Script.UsesCmdletBinding;
         }
         foreach (ArgumentTransformationAttribute attribute in parameterMetadata.ArgumentTransformationAttributes)
         {
             using (bindingTracer.TraceScope("Executing DATA GENERATION metadata: [{0}]", new object[] { attribute.GetType() }))
             {
                 try
                 {
                     ArgumentTypeConverterAttribute attribute2 = attribute as ArgumentTypeConverterAttribute;
                     if (attribute2 != null)
                     {
                         if (flag2)
                         {
                             argumentValue = attribute2.Transform(this.engine, argumentValue, true, bindingScriptCmdlet);
                         }
                     }
                     else
                     {
                         argumentValue = attribute.Transform(this.engine, argumentValue);
                     }
                     bindingTracer.WriteLine("result returned from DATA GENERATION: {0}", new object[] { argumentValue });
                 }
                 catch (Exception exception)
                 {
                     CommandProcessorBase.CheckForSevereException(exception);
                     bindingTracer.WriteLine("ERROR: DATA GENERATION: {0}", new object[] { exception.Message });
                     ParameterBindingException exception2 = new ParameterBindingArgumentTransformationException(exception, ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, (argumentValue == null) ? null : argumentValue.GetType(), "ParameterBinderStrings", "ParameterArgumentTransformationError", new object[] { exception.Message });
                     throw exception2;
                 }
             }
         }
         if (flag2)
         {
             argumentValue = this.CoerceTypeAsNeeded(parameter, parameterMetadata.Name, parameterMetadata.Type, parameterMetadata.CollectionTypeInformation, argumentValue);
         }
         else if (!this.ShouldContinueUncoercedBind(parameter, parameterMetadata, flags, ref argumentValue))
         {
             goto Label_040E;
         }
         if ((parameterMetadata.PSTypeName != null) && (argumentValue != null))
         {
             IEnumerable enumerable = LanguagePrimitives.GetEnumerable(argumentValue);
             if (enumerable != null)
             {
                 foreach (object obj3 in enumerable)
                 {
                     this.ValidatePSTypeName(parameter, parameterMetadata, !flag2, obj3);
                 }
             }
             else
             {
                 this.ValidatePSTypeName(parameter, parameterMetadata, !flag2, argumentValue);
             }
         }
         if ((flags & ParameterBindingFlags.IsDefaultValue) == ParameterBindingFlags.None)
         {
             foreach (ValidateArgumentsAttribute attribute3 in parameterMetadata.ValidationAttributes)
             {
                 using (bindingTracer.TraceScope("Executing VALIDATION metadata: [{0}]", new object[] { attribute3.GetType() }))
                 {
                     try
                     {
                         attribute3.InternalValidate(argumentValue, this.engine);
                     }
                     catch (Exception exception3)
                     {
                         CommandProcessorBase.CheckForSevereException(exception3);
                         bindingTracer.WriteLine("ERROR: VALIDATION FAILED: {0}", new object[] { exception3.Message });
                         ParameterBindingValidationException exception4 = new ParameterBindingValidationException(exception3, ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, (argumentValue == null) ? null : argumentValue.GetType(), "ParameterBinderStrings", "ParameterArgumentValidationError", new object[] { exception3.Message });
                         throw exception4;
                     }
                     tracer.WriteLine("Validation attribute on {0} returned {1}.", new object[] { parameterMetadata.Name, flag });
                 }
             }
             if (IsParameterMandatory(parameterMetadata))
             {
                 this.ValidateNullOrEmptyArgument(parameter, parameterMetadata, parameterMetadata.Type, argumentValue, true);
             }
         }
         Exception innerException = null;
         try
         {
             this.BindParameter(parameter.ParameterName, argumentValue);
             flag = true;
         }
         catch (SetValueException exception6)
         {
             innerException = exception6;
         }
         if (innerException != null)
         {
             Type typeSpecified = (argumentValue == null) ? null : argumentValue.GetType();
             ParameterBindingException exception7 = new ParameterBindingException(innerException, ErrorCategory.WriteError, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, typeSpecified, "ParameterBinderStrings", "ParameterBindingFailed", new object[] { innerException.Message });
             throw exception7;
         }
     Label_040E:;
         bindingTracer.WriteLine("BIND arg [{0}] to param [{1}] {2}", new object[] { argumentValue, parameter.ParameterName, flag ? "SUCCESSFUL" : "SKIPPED" });
         if (flag)
         {
             if (this.RecordBoundParameters)
             {
                 this.CommandLineParameters.Add(parameter.ParameterName, argumentValue);
             }
             MshCommandRuntime commandRuntime = this.Command.commandRuntime as MshCommandRuntime;
             if ((commandRuntime != null) && commandRuntime.LogPipelineExecutionDetail)
             {
                 IEnumerable source = LanguagePrimitives.GetEnumerable(argumentValue);
                 if (source != null)
                 {
                     string parameterValue = string.Join(", ", source.Cast<object>().ToArray<object>());
                     commandRuntime.PipelineProcessor.LogExecutionParameterBinding(this.InvocationInfo, parameter.ParameterName, parameterValue);
                 }
                 else
                 {
                     commandRuntime.PipelineProcessor.LogExecutionParameterBinding(this.InvocationInfo, parameter.ParameterName, (argumentValue == null) ? "" : argumentValue.ToString());
                 }
             }
         }
         return flag;
     }
 }
コード例 #51
0
 private void AddParameter(MemberInfo member, bool processingDynamicParameters)
 {
     bool flag = false;
     bool flag2 = false;
     this.CheckForReservedParameter(member.Name);
     if (this.bindableParameters.ContainsKey(member.Name))
     {
         CompiledCommandParameter parameter = this.bindableParameters[member.Name];
         Type declaringType = parameter.DeclaringType;
         if (declaringType == null)
         {
             flag = true;
         }
         else if (declaringType.IsSubclassOf(member.DeclaringType))
         {
             flag2 = true;
         }
         else if (member.DeclaringType.IsSubclassOf(declaringType))
         {
             this.RemoveParameter(parameter);
         }
         else
         {
             flag = true;
         }
     }
     if (flag)
     {
         throw new System.Management.Automation.MetadataException("DuplicateParameterDefinition", null, ParameterBinderStrings.DuplicateParameterDefinition, new object[] { member.Name });
     }
     if (!flag2)
     {
         CompiledCommandParameter parameter2 = new CompiledCommandParameter(member, processingDynamicParameters);
         this.AddParameter(parameter2, true);
     }
 }
コード例 #52
0
ファイル: ParameterBinderBase.cs プロジェクト: nickchal/pash
 private static bool IsParameterMandatory(CompiledCommandParameter parameterMetadata)
 {
     bool flag = false;
     foreach (ParameterSetSpecificMetadata metadata in parameterMetadata.ParameterSetData.Values)
     {
         if (metadata.IsMandatory)
         {
             flag = true;
             break;
         }
     }
     tracer.WriteLine("isMandatory = {0}", new object[] { flag });
     return flag;
 }
コード例 #53
0
        /// <summary>
        /// Binds a parameter for a native command (application).
        /// </summary>
        /// <param name="name">
        ///     The name of the parameter to bind the value to. For applications
        ///     this just becomes another parameter...
        /// </param>
        /// <param name="value">
        ///     The value to bind to the parameter. It should be assumed by
        ///     derived classes that the proper type coercion has already taken
        ///     place and that any prerequisite metadata has been satisfied.
        /// </param>
        /// <param name="parameterMetadata"></param>
        internal override void BindParameter(string name, object value, CompiledCommandParameter parameterMetadata)
        {
            Diagnostics.Assert(false, "Unreachable code");

            throw new NotSupportedException();
        }
コード例 #54
0
ファイル: ParameterBinderBase.cs プロジェクト: nickchal/pash
 private bool ShouldContinueUncoercedBind(CommandParameterInternal parameter, CompiledCommandParameter parameterMetadata, ParameterBindingFlags flags, ref object parameterValue)
 {
     bool flag = false;
     Type c = parameterMetadata.Type;
     if (parameterValue == null)
     {
         return (((c == null) || ((flags & ParameterBindingFlags.IsDefaultValue) != ParameterBindingFlags.None)) || (!c.IsValueType && (c != typeof(string))));
     }
     Type type = parameterValue.GetType();
     if (type == c)
     {
         return true;
     }
     if (type.IsSubclassOf(c))
     {
         return true;
     }
     if (c.IsAssignableFrom(type))
     {
         return true;
     }
     if ((parameterValue is PSObject) && !((PSObject) parameterValue).immediateBaseObjectIsEmpty)
     {
         parameterValue = ((PSObject) parameterValue).BaseObject;
         type = parameterValue.GetType();
         if (((type == c) || type.IsSubclassOf(c)) || c.IsAssignableFrom(type))
         {
             return true;
         }
     }
     if (parameterMetadata.CollectionTypeInformation.ParameterCollectionType != ParameterCollectionType.NotCollection)
     {
         bool coercionRequired = false;
         object obj2 = this.EncodeCollection(parameter, parameterMetadata.Name, parameterMetadata.CollectionTypeInformation, c, parameterValue, false, out coercionRequired);
         if ((obj2 != null) && !coercionRequired)
         {
             parameterValue = obj2;
             flag = true;
         }
     }
     return flag;
 }
コード例 #55
0
ファイル: ParameterBinderBase.cs プロジェクト: nickchal/pash
 private void ValidateNullOrEmptyArgument(CommandParameterInternal parameter, CompiledCommandParameter parameterMetadata, Type argumentType, object parameterValue, bool recurseIntoCollections)
 {
     if ((parameterValue == null) && (argumentType != typeof(bool?)))
     {
         if (!parameterMetadata.AllowsNullArgument)
         {
             bindingTracer.WriteLine("ERROR: Argument cannot be null", new object[0]);
             ParameterBindingValidationException exception = new ParameterBindingValidationException(ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, argumentType, (parameterValue == null) ? null : parameterValue.GetType(), "ParameterBinderStrings", "ParameterArgumentValidationErrorNullNotAllowed", new object[0]);
             throw exception;
         }
     }
     else if (argumentType == typeof(string))
     {
         string str = parameterValue as string;
         if ((str.Length == 0) && !parameterMetadata.AllowsEmptyStringArgument)
         {
             bindingTracer.WriteLine("ERROR: Argument cannot be an empty string", new object[0]);
             ParameterBindingValidationException exception2 = new ParameterBindingValidationException(ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, (parameterValue == null) ? null : parameterValue.GetType(), "ParameterBinderStrings", "ParameterArgumentValidationErrorEmptyStringNotAllowed", new object[0]);
             throw exception2;
         }
     }
     else if (recurseIntoCollections)
     {
         switch (parameterMetadata.CollectionTypeInformation.ParameterCollectionType)
         {
             case ParameterCollectionType.IList:
             case ParameterCollectionType.Array:
             case ParameterCollectionType.ICollectionGeneric:
             {
                 IEnumerator enumerator = LanguagePrimitives.GetEnumerator(parameterValue);
                 bool flag = true;
                 while (ParserOps.MoveNext(null, null, enumerator))
                 {
                     object obj2 = ParserOps.Current(null, enumerator);
                     flag = false;
                     this.ValidateNullOrEmptyArgument(parameter, parameterMetadata, parameterMetadata.CollectionTypeInformation.ElementType, obj2, false);
                 }
                 if (flag && !parameterMetadata.AllowsEmptyCollectionArgument)
                 {
                     bindingTracer.WriteLine("ERROR: Argument cannot be an empty collection", new object[0]);
                     ParameterBindingValidationException exception3 = new ParameterBindingValidationException(ErrorCategory.InvalidData, this.InvocationInfo, this.GetErrorExtent(parameter), parameterMetadata.Name, parameterMetadata.Type, (parameterValue == null) ? null : parameterValue.GetType(), "ParameterBinderStrings", (parameterMetadata.CollectionTypeInformation.ParameterCollectionType == ParameterCollectionType.Array) ? "ParameterArgumentValidationErrorEmptyArrayNotAllowed" : "ParameterArgumentValidationErrorEmptyCollectionNotAllowed", new object[0]);
                     throw exception3;
                 }
                 return;
             }
         }
     }
 }
コード例 #56
0
        private static bool IsSwitchAndSetValue(string argumentName, CommandParameterInternal argument, CompiledCommandParameter matchingParameter)
        {
            bool flag = false;

            if (matchingParameter.Type == typeof(SwitchParameter))
            {
                argument.ParameterName = argumentName;
                argument.SetArgumentValue(PositionUtilities.EmptyExtent, SwitchParameter.Present);
                flag = true;
            }
            return(flag);
        }