diff --git a/Engine/Commands/GetScriptAnalyzerRuleCommand.cs b/Engine/Commands/GetScriptAnalyzerRuleCommand.cs
index cb38d7b55..95ed669cc 100644
--- a/Engine/Commands/GetScriptAnalyzerRuleCommand.cs
+++ b/Engine/Commands/GetScriptAnalyzerRuleCommand.cs
@@ -91,7 +91,7 @@ protected override void BeginProcessing()
{
string[] rulePaths = Helper.ProcessCustomRulePaths(customRulePath,
this.SessionState, recurseCustomRulePath);
- ScriptAnalyzer.Instance.Initialize(this, rulePaths);
+ ScriptAnalyzer.Instance.Initialize(this, rulePaths, null, null, null, null == rulePaths ? true : false);
}
///
diff --git a/Engine/Commands/InvokeScriptAnalyzerCommand.cs b/Engine/Commands/InvokeScriptAnalyzerCommand.cs
index ada75920b..936d38925 100644
--- a/Engine/Commands/InvokeScriptAnalyzerCommand.cs
+++ b/Engine/Commands/InvokeScriptAnalyzerCommand.cs
@@ -93,6 +93,18 @@ public SwitchParameter RecurseCustomRulePath
}
private bool recurseCustomRulePath;
+ ///
+ /// IncludeDefaultRules: Invoke default rules along with Custom rules
+ ///
+ [Parameter(Mandatory = false)]
+ [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
+ public SwitchParameter IncludeDefaultRules
+ {
+ get { return includeDefaultRules; }
+ set { includeDefaultRules = value; }
+ }
+ private bool includeDefaultRules;
+
///
/// ExcludeRule: Array of names of rules to be disabled.
///
@@ -195,6 +207,7 @@ protected override void BeginProcessing()
this.includeRule,
this.excludeRule,
this.severity,
+ null == rulePaths ? true : this.includeDefaultRules,
this.suppressedOnly,
this.configuration);
}
diff --git a/Engine/ScriptAnalyzer.cs b/Engine/ScriptAnalyzer.cs
index c0e685c40..e9241770d 100644
--- a/Engine/ScriptAnalyzer.cs
+++ b/Engine/ScriptAnalyzer.cs
@@ -96,10 +96,11 @@ public static ScriptAnalyzer Instance
///
internal void Initialize(
TCmdlet cmdlet,
- string[] customizedRulePath = null,
+ string[] customizedRulePath = null,
string[] includeRuleNames = null,
string[] excludeRuleNames = null,
string[] severity = null,
+ bool includeDefaultRules = false,
bool suppressedOnly = false,
string profile = null)
where TCmdlet : PSCmdlet, IOutputWriter
@@ -117,6 +118,7 @@ internal void Initialize(
includeRuleNames,
excludeRuleNames,
severity,
+ includeDefaultRules,
suppressedOnly,
profile);
}
@@ -127,10 +129,11 @@ internal void Initialize(
public void Initialize(
Runspace runspace,
IOutputWriter outputWriter,
- string[] customizedRulePath = null,
+ string[] customizedRulePath = null,
string[] includeRuleNames = null,
string[] excludeRuleNames = null,
string[] severity = null,
+ bool includeDefaultRules = false,
bool suppressedOnly = false,
string profile = null)
{
@@ -147,6 +150,7 @@ public void Initialize(
includeRuleNames,
excludeRuleNames,
severity,
+ includeDefaultRules,
suppressedOnly,
profile);
}
@@ -308,10 +312,11 @@ private void Initialize(
IOutputWriter outputWriter,
PathIntrinsics path,
CommandInvocationIntrinsics invokeCommand,
- string[] customizedRulePath,
- string[] includeRuleNames,
+ string[] customizedRulePath,
+ string[] includeRuleNames,
string[] excludeRuleNames,
string[] severity,
+ bool includeDefaultRules = false,
bool suppressedOnly = false,
string profile = null)
{
@@ -358,7 +363,7 @@ private void Initialize(
try
{
- this.LoadRules(this.validationResults, invokeCommand, null == customizedRulePath ? true : false);
+ this.LoadRules(this.validationResults, invokeCommand, includeDefaultRules);
}
catch (Exception ex)
{
@@ -386,11 +391,11 @@ private void Initialize(
{
this.outputWriter.ThrowTerminatingError(
new ErrorRecord(
- new Exception(),
+ new Exception(),
string.Format(
- CultureInfo.CurrentCulture,
- Strings.RulesNotFound),
- ErrorCategory.ResourceExists,
+ CultureInfo.CurrentCulture,
+ Strings.RulesNotFound),
+ ErrorCategory.ResourceExists,
this));
}
diff --git a/Tests/Engine/CustomizedRule.tests.ps1 b/Tests/Engine/CustomizedRule.tests.ps1
index 7f7ded15c..6c3cb10e9 100644
--- a/Tests/Engine/CustomizedRule.tests.ps1
+++ b/Tests/Engine/CustomizedRule.tests.ps1
@@ -86,33 +86,30 @@ Describe "Test importing correct customized rules" {
$customizedRulePath.Count | Should Be 1
}
- if (!$testingLibraryUsage)
- {
- It "will show the custom rule when given a rule folder path with trailing backslash" {
- $customizedRulePath = Get-ScriptAnalyzerRule -CustomizedRulePath $directory\samplerule\ | Where-Object {$_.RuleName -eq $measure}
- $customizedRulePath.Count | Should Be 1
- }
+ It "will show the custom rule when given a rule folder path with trailing backslash" {
+ $customizedRulePath = Get-ScriptAnalyzerRule -CustomizedRulePath $directory\samplerule\ | Where-Object {$_.RuleName -eq $measure}
+ $customizedRulePath.Count | Should Be 1
+ }
- It "will show the custom rules when given a glob" {
- $customizedRulePath = Get-ScriptAnalyzerRule -CustomizedRulePath $directory\samplerule\samplerule* | Where-Object {$_.RuleName -match $measure}
- $customizedRulePath.Count | Should be 4
- }
+ It "will show the custom rules when given a glob" {
+ $customizedRulePath = Get-ScriptAnalyzerRule -CustomizedRulePath $directory\samplerule\samplerule* | Where-Object {$_.RuleName -match $measure}
+ $customizedRulePath.Count | Should be 4
+ }
- It "will show the custom rules when given recurse switch" {
- $customizedRulePath = Get-ScriptAnalyzerRule -RecurseCustomRulePath -CustomizedRulePath "$directory\samplerule", "$directory\samplerule\samplerule2" | Where-Object {$_.RuleName -eq $measure}
- $customizedRulePath.Count | Should be 5
- }
+ It "will show the custom rules when given recurse switch" {
+ $customizedRulePath = Get-ScriptAnalyzerRule -RecurseCustomRulePath -CustomizedRulePath "$directory\samplerule", "$directory\samplerule\samplerule2" | Where-Object {$_.RuleName -eq $measure}
+ $customizedRulePath.Count | Should be 5
+ }
- it "will show the custom rules when given glob with recurse switch" {
- $customizedRulePath = Get-ScriptAnalyzerRule -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule\samplerule* | Where-Object {$_.RuleName -eq $measure}
- $customizedRulePath.Count | Should be 5
- }
-
- it "will show the custom rules when given glob with recurse switch" {
- $customizedRulePath = Get-ScriptAnalyzerRule -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule* | Where-Object {$_.RuleName -eq $measure}
- $customizedRulePath.Count | Should be 3
- }
+ It "will show the custom rules when given glob with recurse switch" {
+ $customizedRulePath = Get-ScriptAnalyzerRule -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule\samplerule* | Where-Object {$_.RuleName -eq $measure}
+ $customizedRulePath.Count | Should be 5
}
+
+ It "will show the custom rules when given glob with recurse switch" {
+ $customizedRulePath = Get-ScriptAnalyzerRule -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule* | Where-Object {$_.RuleName -eq $measure}
+ $customizedRulePath.Count | Should be 3
+ }
}
Context "Test Invoke-ScriptAnalyzer with customized rules" {
@@ -126,33 +123,49 @@ Describe "Test importing correct customized rules" {
$customizedRulePath.Count | Should Be 1
}
- if (!$testingLibraryUsage)
+ if (!$testingLibraryUsage)
{
- It "will show the custom rule in the results when given a rule folder path with trailing backslash" {
- $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -CustomizedRulePath $directory\samplerule\ | Where-Object {$_.Message -eq $message}
- $customizedRulePath.Count | Should Be 1
- }
+ It "will show the custom rule in the results when given a rule folder path with trailing backslash" {
+ $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -CustomizedRulePath $directory\samplerule\ | Where-Object {$_.Message -eq $message}
+ $customizedRulePath.Count | Should Be 1
+ }
+
+ It "will show the custom rules when given a glob" {
+ $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -CustomizedRulePath $directory\samplerule\samplerule* | Where-Object {$_.Message -eq $message}
+ $customizedRulePath.Count | Should be 3
+ }
+
+ It "will show the custom rules when given recurse switch" {
+ $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule | Where-Object {$_.Message -eq $message}
+ $customizedRulePath.Count | Should be 3
+ }
+
+ It "will show the custom rules when given glob with recurse switch" {
+ $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule\samplerule* | Where-Object {$_.Message -eq $message}
+ $customizedRulePath.Count | Should be 4
+ }
+
+ It "will show the custom rules when given glob with recurse switch" {
+ $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule* | Where-Object {$_.Message -eq $message}
+ $customizedRulePath.Count | Should be 3
+ }
+
+ It "Using IncludeDefaultRules Switch with CustomRulePath" {
+ $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -CustomRulePath $directory\samplerule\samplerule.psm1 -IncludeDefaultRules
+ $customizedRulePath.Count | Should Be 2
+ }
- It "will show the custom rules when given a glob" {
- $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -CustomizedRulePath $directory\samplerule\samplerule* | Where-Object {$_.Message -eq $message}
- $customizedRulePath.Count | Should be 3
- }
+ It "Using IncludeDefaultRules Switch without CustomRulePath" {
+ $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -IncludeDefaultRules
+ $customizedRulePath.Count | Should Be 1
+ }
- It "will show the custom rules when given recurse switch" {
- $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule | Where-Object {$_.Message -eq $message}
- $customizedRulePath.Count | Should be 3
- }
+ It "Not Using IncludeDefaultRules Switch and without CustomRulePath" {
+ $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1
+ $customizedRulePath.Count | Should Be 1
+ }
+ }
- it "will show the custom rules when given glob with recurse switch" {
- $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule\samplerule* | Where-Object {$_.Message -eq $message}
- $customizedRulePath.Count | Should be 4
- }
-
- it "will show the custom rules when given glob with recurse switch" {
- $customizedRulePath = Invoke-ScriptAnalyzer $directory\TestScript.ps1 -RecurseCustomRulePath -CustomizedRulePath $directory\samplerule* | Where-Object {$_.Message -eq $message}
- $customizedRulePath.Count | Should be 3
- }
- }
}
}
diff --git a/Tests/Engine/GetScriptAnalyzerRule.tests.ps1 b/Tests/Engine/GetScriptAnalyzerRule.tests.ps1
index fdc945f37..d992f5ca4 100644
--- a/Tests/Engine/GetScriptAnalyzerRule.tests.ps1
+++ b/Tests/Engine/GetScriptAnalyzerRule.tests.ps1
@@ -53,6 +53,11 @@ Describe "Test Name parameters" {
($rules | Where-Object {$_.RuleName -eq $singularNouns}).Count | Should Be 1
($rules | Where-Object {$_.RuleName -eq $approvedVerbs}).Count | Should Be 1
}
+
+ It "Get Rules with no parameters supplied" {
+ $defaultRules = Get-ScriptAnalyzerRule
+ $defaultRules.Count | Should be 38
+ }
}
Context "When used incorrectly" {
diff --git a/Tests/Engine/LibraryUsage.tests.ps1 b/Tests/Engine/LibraryUsage.tests.ps1
index 41d2de3d5..432ac8cee 100644
--- a/Tests/Engine/LibraryUsage.tests.ps1
+++ b/Tests/Engine/LibraryUsage.tests.ps1
@@ -31,22 +31,24 @@ function Invoke-ScriptAnalyzer {
[ValidateSet("Warning", "Error", "Information", IgnoreCase = $true)]
[Parameter(Mandatory = $false)]
[string[]] $Severity = $null,
-
+
[Parameter(Mandatory = $false)]
[switch] $Recurse,
+ [Parameter(Mandatory = $false)]
+ [switch] $IncludeDefaultRules,
+
[Parameter(Mandatory = $false)]
[switch] $SuppressedOnly,
[Parameter(Mandatory = $false)]
[string] $Profile = $null
- )
- # There is an inconsistency between this implementation and c# implementation of the cmdlet.
- # The CustomRulePath parameter here is of "string[]" type whereas in the c# implementation it is of "string" type.
- # If we set the CustomRulePath parameter here to "string[]", then the library usage test fails when run as an administrator.
- # We want to note that the library usage test doesn't fail when run as a non-admin user.
- # The following is the error statement when the test runs as an administrator.
- # Assert failed on "Initialize" with "7" argument(s): "Test failed due to terminating error: The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)"
+ )
+
+ if ($null -eq $CustomRulePath)
+ {
+ $IncludeDefaultRules = $true
+ }
$scriptAnalyzer = New-Object "Microsoft.Windows.PowerShell.ScriptAnalyzer.ScriptAnalyzer";
$scriptAnalyzer.Initialize(
@@ -56,6 +58,7 @@ function Invoke-ScriptAnalyzer {
$IncludeRule,
$ExcludeRule,
$Severity,
+ $IncludeDefaultRules.IsPresent,
$SuppressedOnly.IsPresent,
$Profile
);