@@ -99,7 +99,8 @@ internal void Initialize<TCmdlet>(
9999 string [ ] includeRuleNames = null ,
100100 string [ ] excludeRuleNames = null ,
101101 string [ ] severity = null ,
102- bool suppressedOnly = false )
102+ bool suppressedOnly = false ,
103+ string profile = null )
103104 where TCmdlet : PSCmdlet , IOutputWriter
104105 {
105106 if ( cmdlet == null )
@@ -115,7 +116,8 @@ internal void Initialize<TCmdlet>(
115116 includeRuleNames ,
116117 excludeRuleNames ,
117118 severity ,
118- suppressedOnly ) ;
119+ suppressedOnly ,
120+ profile ) ;
119121 }
120122
121123 /// <summary>
@@ -128,7 +130,8 @@ public void Initialize(
128130 string [ ] includeRuleNames = null ,
129131 string [ ] excludeRuleNames = null ,
130132 string [ ] severity = null ,
131- bool suppressedOnly = false )
133+ bool suppressedOnly = false ,
134+ string profile = null )
132135 {
133136 if ( runspace == null )
134137 {
@@ -143,7 +146,8 @@ public void Initialize(
143146 includeRuleNames ,
144147 excludeRuleNames ,
145148 severity ,
146- suppressedOnly ) ;
149+ suppressedOnly ,
150+ profile ) ;
147151 }
148152
149153 private void Initialize (
@@ -154,7 +158,8 @@ private void Initialize(
154158 string [ ] includeRuleNames ,
155159 string [ ] excludeRuleNames ,
156160 string [ ] severity ,
157- bool suppressedOnly = false )
161+ bool suppressedOnly = false ,
162+ string profile = null )
158163 {
159164 if ( outputWriter == null )
160165 {
@@ -178,6 +183,145 @@ private void Initialize(
178183 this . includeRegexList = new List < Regex > ( ) ;
179184 this . excludeRegexList = new List < Regex > ( ) ;
180185
186+ if ( ! String . IsNullOrWhiteSpace ( profile ) )
187+ {
188+ try
189+ {
190+ profile = path . GetResolvedPSPathFromPSPath ( profile ) . First ( ) . Path ;
191+ }
192+ catch
193+ {
194+ this . outputWriter . WriteError ( new ErrorRecord ( new FileNotFoundException ( ) ,
195+ string . Format ( CultureInfo . CurrentCulture , Strings . FileNotFound , profile ) ,
196+ ErrorCategory . InvalidArgument , this ) ) ;
197+ }
198+
199+ if ( File . Exists ( profile ) )
200+ {
201+ Token [ ] parserTokens = null ;
202+ ParseError [ ] parserErrors = null ;
203+ Ast profileAst = Parser . ParseFile ( profile , out parserTokens , out parserErrors ) ;
204+ IEnumerable < Ast > hashTableAsts = profileAst . FindAll ( item => item is HashtableAst , false ) ;
205+ foreach ( HashtableAst hashTableAst in hashTableAsts )
206+ {
207+ foreach ( var kvp in hashTableAst . KeyValuePairs )
208+ {
209+ if ( ! ( kvp . Item1 is StringConstantExpressionAst ) )
210+ {
211+ this . outputWriter . WriteError ( new ErrorRecord ( new ArgumentException ( ) ,
212+ string . Format ( CultureInfo . CurrentCulture , Strings . WrongKeyFormat , kvp . Item1 . Extent . StartLineNumber , kvp . Item1 . Extent . StartColumnNumber , profile ) ,
213+ ErrorCategory . InvalidArgument , this ) ) ;
214+ continue ;
215+ }
216+
217+ // parse the item2 as array
218+ PipelineAst pipeAst = kvp . Item2 as PipelineAst ;
219+ List < string > rhsList = new List < string > ( ) ;
220+ if ( pipeAst != null )
221+ {
222+ ExpressionAst pureExp = pipeAst . GetPureExpression ( ) ;
223+ if ( pureExp is StringConstantExpressionAst )
224+ {
225+ rhsList . Add ( ( pureExp as StringConstantExpressionAst ) . Value ) ;
226+ }
227+ else
228+ {
229+ ArrayLiteralAst arrayLitAst = pureExp as ArrayLiteralAst ;
230+ if ( arrayLitAst == null && pureExp is ArrayExpressionAst )
231+ {
232+ ArrayExpressionAst arrayExp = pureExp as ArrayExpressionAst ;
233+ // Statements property is never null
234+ if ( arrayExp . SubExpression != null )
235+ {
236+ StatementAst stateAst = arrayExp . SubExpression . Statements . First ( ) ;
237+ if ( stateAst != null && stateAst is PipelineAst )
238+ {
239+ CommandBaseAst cmdBaseAst = ( stateAst as PipelineAst ) . PipelineElements . First ( ) ;
240+ if ( cmdBaseAst != null && cmdBaseAst is CommandExpressionAst )
241+ {
242+ CommandExpressionAst cmdExpAst = cmdBaseAst as CommandExpressionAst ;
243+ if ( cmdExpAst . Expression is StringConstantExpressionAst )
244+ {
245+ rhsList . Add ( ( cmdExpAst . Expression as StringConstantExpressionAst ) . Value ) ;
246+ }
247+ else
248+ {
249+ arrayLitAst = cmdExpAst . Expression as ArrayLiteralAst ;
250+ }
251+ }
252+ }
253+ }
254+ }
255+
256+ if ( arrayLitAst != null )
257+ {
258+ foreach ( var element in arrayLitAst . Elements )
259+ {
260+ if ( ! ( element is StringConstantExpressionAst ) )
261+ {
262+ this . outputWriter . WriteError ( new ErrorRecord ( new ArgumentException ( ) ,
263+ string . Format ( CultureInfo . CurrentCulture , Strings . WrongValueFormat , element . Extent . StartLineNumber , element . Extent . StartColumnNumber , profile ) ,
264+ ErrorCategory . InvalidArgument , this ) ) ;
265+ continue ;
266+ }
267+
268+ rhsList . Add ( ( element as StringConstantExpressionAst ) . Value ) ;
269+ }
270+ }
271+ }
272+ }
273+
274+ if ( rhsList . Count == 0 )
275+ {
276+ this . outputWriter . WriteError ( new ErrorRecord ( new ArgumentException ( ) ,
277+ string . Format ( CultureInfo . CurrentCulture , Strings . WrongValueFormat , kvp . Item2 . Extent . StartLineNumber , kvp . Item2 . Extent . StartColumnNumber , profile ) ,
278+ ErrorCategory . InvalidArgument , this ) ) ;
279+ break ;
280+ }
281+
282+ switch ( ( kvp . Item1 as StringConstantExpressionAst ) . Value . ToLower ( ) )
283+ {
284+ case "severity" :
285+ if ( this . severity == null )
286+ {
287+ this . severity = rhsList . ToArray ( ) ;
288+ }
289+ else
290+ {
291+ this . severity = this . severity . Union ( rhsList ) . ToArray ( ) ;
292+ }
293+ break ;
294+ case "includerules" :
295+ if ( this . includeRule == null )
296+ {
297+ this . includeRule = rhsList . ToArray ( ) ;
298+ }
299+ else
300+ {
301+ this . includeRule = this . includeRule . Union ( rhsList ) . ToArray ( ) ;
302+ }
303+ break ;
304+ case "excluderules" :
305+ if ( this . excludeRule == null )
306+ {
307+ this . excludeRule = rhsList . ToArray ( ) ;
308+ }
309+ else
310+ {
311+ this . excludeRule = this . excludeRule . Union ( rhsList ) . ToArray ( ) ;
312+ }
313+ break ;
314+ default :
315+ this . outputWriter . WriteError ( new ErrorRecord ( new ArgumentException ( ) ,
316+ string . Format ( CultureInfo . CurrentCulture , Strings . WrongKey , kvp . Item1 . Extent . StartLineNumber , kvp . Item1 . Extent . StartColumnNumber , profile ) ,
317+ ErrorCategory . InvalidArgument , this ) ) ;
318+ break ;
319+ }
320+ }
321+ }
322+ }
323+ }
324+
181325 //Check wild card input for the Include/ExcludeRules and create regex match patterns
182326 if ( this . includeRule != null )
183327 {
0 commit comments