// Expand a list of (possibly wildcarded) expressions into resolved expressions that // match property names on the incoming objects. private static void ExpandExpressions(PSObject inputObject, List <MshParameter> UnexpandedParametersWithWildCardPattern, List <MshParameter> expandedParameterList) { if (UnexpandedParametersWithWildCardPattern != null) { foreach (MshParameter unexpandedParameter in UnexpandedParametersWithWildCardPattern) { PSPropertyExpression ex = (PSPropertyExpression)unexpandedParameter.GetEntry(FormatParameterDefinitionKeys.ExpressionEntryKey); SortedDictionary <string, PSPropertyExpression> expandedPropertyNames = new SortedDictionary <string, PSPropertyExpression>(StringComparer.OrdinalIgnoreCase); if (inputObject == null) { continue; } foreach (PSPropertyExpression resolvedName in ex.ResolveNames(PSObject.AsPSObject(inputObject))) { expandedPropertyNames[resolvedName.ToString()] = resolvedName; } foreach (PSPropertyExpression expandedExpression in expandedPropertyNames.Values) { MshParameter expandedParameter = new MshParameter(); expandedParameter.hash = (Hashtable)unexpandedParameter.hash.Clone(); expandedParameter.hash[FormatParameterDefinitionKeys.ExpressionEntryKey] = expandedExpression; expandedParameterList.Add(expandedParameter); } } } }
/// <summary> /// Resolve all wildcards in user input Property into resolvedNameMshParameters. /// </summary> private void InitializeResolvedNameMshParameters() { // temp list of properties with wildcards resolved var resolvedNameProperty = new List <object>(); foreach (MshParameter p in _propertyMshParameterList) { string label = p.GetEntry(ConvertHTMLParameterDefinitionKeys.LabelEntryKey) as string; string alignment = p.GetEntry(ConvertHTMLParameterDefinitionKeys.AlignmentEntryKey) as string; // Accept the width both as a string and as an int. string width; int? widthNum = p.GetEntry(ConvertHTMLParameterDefinitionKeys.WidthEntryKey) as int?; width = widthNum != null?widthNum.Value.ToString() : p.GetEntry(ConvertHTMLParameterDefinitionKeys.WidthEntryKey) as string; PSPropertyExpression ex = p.GetEntry(FormatParameterDefinitionKeys.ExpressionEntryKey) as PSPropertyExpression; List <PSPropertyExpression> resolvedNames = ex.ResolveNames(_inputObject); foreach (PSPropertyExpression resolvedName in resolvedNames) { Hashtable ht = CreateAuxPropertyHT(label, alignment, width); if (resolvedName.Script != null) { // The argument is a calculated property whose value is calculated by a script block. ht.Add(FormatParameterDefinitionKeys.ExpressionEntryKey, resolvedName.Script); } else { ht.Add(FormatParameterDefinitionKeys.ExpressionEntryKey, resolvedName.ToString()); } resolvedNameProperty.Add(ht); } } _resolvedNameMshParameters = ProcessParameter(resolvedNameProperty.ToArray()); }
// Expand a list of (possibly wildcarded) expressions into resolved expressions that // match property names on the incoming objects. private static List <MshParameter> ExpandExpressions(List <PSObject> inputObjects, List <MshParameter> unexpandedParameterList) { List <MshParameter> expandedParameterList = new List <MshParameter>(); if (unexpandedParameterList != null) { foreach (MshParameter unexpandedParameter in unexpandedParameterList) { PSPropertyExpression ex = (PSPropertyExpression)unexpandedParameter.GetEntry(FormatParameterDefinitionKeys.ExpressionEntryKey); if (!ex.HasWildCardCharacters) // this special cases 1) script blocks and 2) wildcard-less strings { expandedParameterList.Add(unexpandedParameter); } else { SortedDictionary <string, PSPropertyExpression> expandedPropertyNames = new SortedDictionary <string, PSPropertyExpression>(StringComparer.OrdinalIgnoreCase); if (inputObjects != null) { foreach (object inputObject in inputObjects) { if (inputObject == null) { continue; } foreach (PSPropertyExpression resolvedName in ex.ResolveNames(PSObject.AsPSObject(inputObject))) { expandedPropertyNames[resolvedName.ToString()] = resolvedName; } } } foreach (PSPropertyExpression expandedExpression in expandedPropertyNames.Values) { MshParameter expandedParameter = new MshParameter(); expandedParameter.hash = (Hashtable)unexpandedParameter.hash.Clone(); expandedParameter.hash[FormatParameterDefinitionKeys.ExpressionEntryKey] = expandedExpression; expandedParameterList.Add(expandedParameter); } } } } return(expandedParameterList); }
/// <summary> /// Resolve all wildcards in user input Property into resolvedNameMshParameters. /// </summary> private void InitializeResolvedNameMshParameters() { // temp list of properties with wildcards resolved ArrayList resolvedNameProperty = new ArrayList(); foreach (MshParameter p in _propertyMshParameterList) { string label = p.GetEntry(ConvertHTMLParameterDefinitionKeys.LabelEntryKey) as string; string alignment = p.GetEntry(ConvertHTMLParameterDefinitionKeys.AlignmentEntryKey) as string; string width = p.GetEntry(ConvertHTMLParameterDefinitionKeys.WidthEntryKey) as string; PSPropertyExpression ex = p.GetEntry(FormatParameterDefinitionKeys.ExpressionEntryKey) as PSPropertyExpression; List <PSPropertyExpression> resolvedNames = ex.ResolveNames(_inputObject); foreach (PSPropertyExpression resolvedName in resolvedNames) { Hashtable ht = CreateAuxPropertyHT(label, alignment, width); ht.Add(FormatParameterDefinitionKeys.ExpressionEntryKey, resolvedName.ToString()); resolvedNameProperty.Add(ht); } } _resolvedNameMshParameters = ProcessParameter(resolvedNameProperty.ToArray()); }
private void ProcessParameter(MshParameter p, PSObject inputObject, List <PSNoteProperty> result) { string name = p.GetEntry(NameEntryDefinition.NameEntryKey) as string; PSPropertyExpression ex = p.GetEntry(FormatParameterDefinitionKeys.ExpressionEntryKey) as PSPropertyExpression; List <PSPropertyExpressionResult> expressionResults = new(); foreach (PSPropertyExpression resolvedName in ex.ResolveNames(inputObject)) { if (_exclusionFilter == null || !_exclusionFilter.IsMatch(resolvedName)) { List <PSPropertyExpressionResult> tempExprResults = resolvedName.GetValues(inputObject); if (tempExprResults == null) { continue; } foreach (PSPropertyExpressionResult mshExpRes in tempExprResults) { expressionResults.Add(mshExpRes); } } } // allow 'Select-Object -Property noexist-name' to return a PSObject with property noexist-name, // unless noexist-name itself contains wildcards if (expressionResults.Count == 0 && !ex.HasWildCardCharacters) { expressionResults.Add(new PSPropertyExpressionResult(null, ex, null)); } // if we have an expansion, renaming is not acceptable else if (!string.IsNullOrEmpty(name) && expressionResults.Count > 1) { string errorMsg = SelectObjectStrings.RenamingMultipleResults; ErrorRecord errorRecord = new( new InvalidOperationException(errorMsg), "RenamingMultipleResults", ErrorCategory.InvalidOperation, inputObject); WriteError(errorRecord); return; } foreach (PSPropertyExpressionResult r in expressionResults) { // filter the exclusions, if any if (_exclusionFilter != null && _exclusionFilter.IsMatch(r.ResolvedExpression)) { continue; } PSNoteProperty mshProp; if (string.IsNullOrEmpty(name)) { string resolvedExpressionName = r.ResolvedExpression.ToString(); if (string.IsNullOrEmpty(resolvedExpressionName)) { PSArgumentException mshArgE = PSTraceSource.NewArgumentException( "Property", SelectObjectStrings.EmptyScriptBlockAndNoName); ThrowTerminatingError( new ErrorRecord( mshArgE, "EmptyScriptBlockAndNoName", ErrorCategory.InvalidArgument, null)); } mshProp = new PSNoteProperty(resolvedExpressionName, r.Result); } else { mshProp = new PSNoteProperty(name, r.Result); } result.Add(mshProp); } }