diff --git a/Engine/Helper.cs b/Engine/Helper.cs
index 8864ac136..2f334241d 100644
--- a/Engine/Helper.cs
+++ b/Engine/Helper.cs
@@ -494,6 +494,24 @@ public bool IsVariableGlobalOrEnvironment(VariableExpressionAst varAst, Ast ast)
return VariableAnalysisDictionary[ast].IsGlobalOrEnvironment(varAst);
}
+
+ ///
+ /// Checks whether a variable is a global variable.
+ ///
+ ///
+ ///
+ public bool IsVariableGlobal(VariableExpressionAst varAst)
+ {
+ //We ignore the use of built-in variable as global variable
+ if (varAst.VariablePath.IsGlobal)
+ {
+ string varName = varAst.VariablePath.UserPath.Remove(varAst.VariablePath.UserPath.IndexOf("global:", StringComparison.OrdinalIgnoreCase), "global:".Length);
+ return !SpecialVars.InitializedVariables.Contains(varName, StringComparer.OrdinalIgnoreCase);
+ }
+ return false;
+ }
+
+
///
/// Checks whether all the code path of ast returns.
/// Runs InitializeVariableAnalysis before calling this method
diff --git a/Rules/AvoidGlobalVars.cs b/Rules/AvoidGlobalVars.cs
index 6da1cdb91..109da5ee5 100644
--- a/Rules/AvoidGlobalVars.cs
+++ b/Rules/AvoidGlobalVars.cs
@@ -41,7 +41,7 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName)
{
foreach (VariableExpressionAst varAst in varAsts)
{
- if (varAst.VariablePath.IsGlobal)
+ if (Helper.Instance.IsVariableGlobal(varAst))
{
yield return
new DiagnosticRecord(
diff --git a/Tests/Rules/AvoidGlobalOrUnitializedVars.ps1 b/Tests/Rules/AvoidGlobalOrUnitializedVars.ps1
index ef6988ad9..e606404f3 100644
--- a/Tests/Rules/AvoidGlobalOrUnitializedVars.ps1
+++ b/Tests/Rules/AvoidGlobalOrUnitializedVars.ps1
@@ -1,4 +1,7 @@
-$Global:1 = "Globalization?"
+$Global:1 = "globalVar“
+$Global:DebugPreference
+
+
function NotGlobal {
$localVars = "Localization?"
diff --git a/Tests/Rules/AvoidGlobalOrUnitializedVarsNoViolations.ps1 b/Tests/Rules/AvoidGlobalOrUnitializedVarsNoViolations.ps1
index ea436bb4f..6a9ce8077 100644
--- a/Tests/Rules/AvoidGlobalOrUnitializedVarsNoViolations.ps1
+++ b/Tests/Rules/AvoidGlobalOrUnitializedVarsNoViolations.ps1
@@ -1,4 +1,7 @@
-function Test {
+$Global:DebugPreference
+
+
+function Test {
$initialized = "Initialized"
$noglobal = "local"
$env:ShouldNotRaiseError
@@ -31,13 +34,6 @@ $proc[0]
function Test-PreferenceVariable
{
- Param(
- [switch]
- $a,
-
- [System.Management.Automation.SwitchParameter]
- $b
- )
if (-not $PSBoundParameters.ContainsKey('Verbose')) {
$VerbosePreference = $PSCmdlet.GetVariableValue('VerbosePreference') -as
@@ -45,4 +41,4 @@ function Test-PreferenceVariable
}
$VerbosePreference
-}
\ No newline at end of file
+ }
\ No newline at end of file