diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs
index 8c378c4165..c6197a4b7b 100644
--- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs
+++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs
@@ -2740,7 +2740,7 @@ function Get-PSImplicitRemotingClientSideParameters
$clientSideParameters = @{}
- $parametersToLeaveRemote = 'ErrorAction', 'WarningAction', 'InformationAction'
+ $parametersToLeaveRemote = 'ErrorAction', 'WarningAction', 'InformationAction', 'ProgressAction'
Modify-PSImplicitRemotingParameters $clientSideParameters $PSBoundParameters 'AsJob'
if ($proxyForCmdlet)
diff --git a/src/System.Management.Automation/engine/CommonCommandParameters.cs b/src/System.Management.Automation/engine/CommonCommandParameters.cs
index c3630fe0b4..ea636dc583 100644
--- a/src/System.Management.Automation/engine/CommonCommandParameters.cs
+++ b/src/System.Management.Automation/engine/CommonCommandParameters.cs
@@ -123,6 +123,27 @@ namespace System.Management.Automation.Internal
set { _commandRuntime.InformationPreference = value; }
}
+ ///
+ /// Gets or sets the value of the ProgressAction parameter for the cmdlet.
+ ///
+ ///
+ /// This parameter tells the command what to do when a progress record occurs.
+ ///
+ ///
+ [Parameter]
+ [Alias("proga")]
+ public ActionPreference ProgressAction
+ {
+ get { return _commandRuntime.ProgressPreference; }
+
+ set { _commandRuntime.ProgressPreference = value; }
+ }
+
///
/// Gets or sets the value of the ErrorVariable parameter for the cmdlet.
///
diff --git a/src/System.Management.Automation/engine/InternalCommands.cs b/src/System.Management.Automation/engine/InternalCommands.cs
index 2afb9c516c..8ef6976c44 100644
--- a/src/System.Management.Automation/engine/InternalCommands.cs
+++ b/src/System.Management.Automation/engine/InternalCommands.cs
@@ -385,10 +385,11 @@ namespace Microsoft.PowerShell.Commands
private void InitParallelParameterSet()
{
// The following common parameters are not (yet) supported in this parameter set.
- // ErrorAction, WarningAction, InformationAction, PipelineVariable.
+ // ErrorAction, WarningAction, InformationAction, ProgressAction, PipelineVariable.
if (MyInvocation.BoundParameters.ContainsKey(nameof(CommonParamSet.ErrorAction)) ||
MyInvocation.BoundParameters.ContainsKey(nameof(CommonParamSet.WarningAction)) ||
MyInvocation.BoundParameters.ContainsKey(nameof(CommonParamSet.InformationAction)) ||
+ MyInvocation.BoundParameters.ContainsKey(nameof(CommonParamSet.ProgressAction)) ||
MyInvocation.BoundParameters.ContainsKey(nameof(CommonParamSet.PipelineVariable)))
{
ThrowTerminatingError(
diff --git a/src/System.Management.Automation/engine/MshCommandRuntime.cs b/src/System.Management.Automation/engine/MshCommandRuntime.cs
index fcc7f5b458..d8bb95b59e 100644
--- a/src/System.Management.Automation/engine/MshCommandRuntime.cs
+++ b/src/System.Management.Automation/engine/MshCommandRuntime.cs
@@ -3330,7 +3330,7 @@ namespace System.Management.Automation
{
get
{
- if (_isProgressPreferenceSet)
+ if (IsProgressActionSet)
return _progressPreference;
if (!_isProgressPreferenceCached)
@@ -3351,12 +3351,14 @@ namespace System.Management.Automation
}
_progressPreference = value;
- _isProgressPreferenceSet = true;
+ IsProgressActionSet = true;
}
}
private ActionPreference _progressPreference = InitialSessionState.DefaultProgressPreference;
- private bool _isProgressPreferenceSet = false;
+
+ internal bool IsProgressActionSet { get; private set; } = false;
+
private bool _isProgressPreferenceCached = false;
///
diff --git a/src/System.Management.Automation/engine/ReflectionParameterBinder.cs b/src/System.Management.Automation/engine/ReflectionParameterBinder.cs
index 0fd8bf8b33..5ee84f4c42 100644
--- a/src/System.Management.Automation/engine/ReflectionParameterBinder.cs
+++ b/src/System.Management.Automation/engine/ReflectionParameterBinder.cs
@@ -207,6 +207,12 @@ namespace System.Management.Automation
v ??= LanguagePrimitives.ThrowInvalidCastException(null, typeof(ActionPreference));
((CommonParameters)o).InformationAction = (ActionPreference)v;
});
+ s_setterMethods.TryAdd(Tuple.Create(typeof(CommonParameters), "ProgressAction"),
+ (o, v) =>
+ {
+ v ??= LanguagePrimitives.ThrowInvalidCastException(null, typeof(ActionPreference));
+ ((CommonParameters)o).ProgressAction = (ActionPreference)v;
+ });
s_setterMethods.TryAdd(Tuple.Create(typeof(CommonParameters), "Verbose"), static (o, v) => ((CommonParameters)o).Verbose = (SwitchParameter)v);
s_setterMethods.TryAdd(Tuple.Create(typeof(CommonParameters), "Debug"), static (o, v) => ((CommonParameters)o).Debug = (SwitchParameter)v);
s_setterMethods.TryAdd(Tuple.Create(typeof(CommonParameters), "ErrorVariable"), static (o, v) => ((CommonParameters)o).ErrorVariable = (string)v);
diff --git a/src/System.Management.Automation/engine/SpecialVariables.cs b/src/System.Management.Automation/engine/SpecialVariables.cs
index d1d90e3507..420b52d4d2 100644
--- a/src/System.Management.Automation/engine/SpecialVariables.cs
+++ b/src/System.Management.Automation/engine/SpecialVariables.cs
@@ -419,5 +419,6 @@ namespace System.Management.Automation
Warning = 13,
Information = 14,
Confirm = 15,
+ Progress = 16,
}
}
diff --git a/src/System.Management.Automation/engine/cmdlet.cs b/src/System.Management.Automation/engine/cmdlet.cs
index e241b972b3..9a02adc4c6 100644
--- a/src/System.Management.Automation/engine/cmdlet.cs
+++ b/src/System.Management.Automation/engine/cmdlet.cs
@@ -50,7 +50,7 @@ namespace System.Management.Automation
() =>
{
return new HashSet(StringComparer.OrdinalIgnoreCase) {
- "Verbose", "Debug", "ErrorAction", "WarningAction", "InformationAction",
+ "Verbose", "Debug", "ErrorAction", "WarningAction", "InformationAction", "ProgressAction",
"ErrorVariable", "WarningVariable", "OutVariable",
"OutBuffer", "PipelineVariable", "InformationVariable" };
}
diff --git a/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs b/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs
index e2b5ee8376..f6b78c884d 100644
--- a/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs
+++ b/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs
@@ -2516,6 +2516,11 @@ namespace System.Management.Automation
_localsTuple.SetPreferenceVariable(PreferenceVariable.Information, _commandRuntime.InformationPreference);
}
+ if (_commandRuntime.IsProgressActionSet)
+ {
+ _localsTuple.SetPreferenceVariable(PreferenceVariable.Progress, _commandRuntime.ProgressPreference);
+ }
+
if (_commandRuntime.IsWhatIfFlagSet)
{
_localsTuple.SetPreferenceVariable(PreferenceVariable.WhatIf, _commandRuntime.WhatIf);
diff --git a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1
index a76013edb2..c2b930deee 100644
--- a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1
+++ b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1
@@ -1620,8 +1620,8 @@ dir -Recurse `
It "Test completion with splatted variable" {
$inputStr = 'Get-Content @Splat -P'
$res = TabExpansion2 -inputScript $inputStr -cursorColumn $inputStr.Length
- $res.CompletionMatches | Should -HaveCount 4
- [string]::Join(',', ($res.CompletionMatches.completiontext | Sort-Object)) | Should -BeExactly "-Path,-PipelineVariable,-PSPath,-pv"
+ $res.CompletionMatches | Should -HaveCount 6
+ [string]::Join(',', ($res.CompletionMatches.completiontext | Sort-Object)) | Should -BeExactly "-Path,-PipelineVariable,-proga,-ProgressAction,-PSPath,-pv"
}
It "Test completion for HttpVersion parameter name" {
@@ -2411,7 +2411,7 @@ Describe "WSMan Config Provider tab complete tests" -Tags Feature,RequireAdminOn
@{path = "localhost\plugin"; parameter = "-ru"; expected = "RunAsCredential"},
@{path = "localhost\plugin"; parameter = "-us"; expected = "UseSharedProcess"},
@{path = "localhost\plugin"; parameter = "-au"; expected = "AutoRestart"},
- @{path = "localhost\plugin"; parameter = "-pr"; expected = "ProcessIdleTimeoutSec"},
+ @{path = "localhost\plugin"; parameter = "-proc"; expected = "ProcessIdleTimeoutSec"},
@{path = "localhost\Plugin\microsoft.powershell\Resources\"; parameter = "-re"; expected = "ResourceUri"},
@{path = "localhost\Plugin\microsoft.powershell\Resources\"; parameter = "-ca"; expected = "Capability"}
) {
diff --git a/test/powershell/Language/Scripting/ActionPreference.Tests.ps1 b/test/powershell/Language/Scripting/ActionPreference.Tests.ps1
index 2f52765250..513fd3adb4 100644
--- a/test/powershell/Language/Scripting/ActionPreference.Tests.ps1
+++ b/test/powershell/Language/Scripting/ActionPreference.Tests.ps1
@@ -194,6 +194,7 @@ Describe "Tests for (error, warning, etc) action preference" -Tags "CI" {
@{ name = "ErrorAction"; argValue = "AutomationNull"; arguments = @{ ErrorAction = [System.Management.Automation.Internal.AutomationNull]::Value } }
@{ name = "WarningAction"; argValue = "AutomationNull"; arguments = @{ WarningAction = [System.Management.Automation.Internal.AutomationNull]::Value } }
@{ name = "InformationAction"; argValue = "AutomationNull"; arguments = @{ InformationAction = [System.Management.Automation.Internal.AutomationNull]::Value } }
+ @{ name = "ProgressAction"; argValue = "AutomationNull"; arguments = @{ ProgressAction = [System.Management.Automation.Internal.AutomationNull]::Value } }
) {
param($arguments)
diff --git a/test/powershell/engine/ExperimentalFeature/ExperimentalFeature.Basic.Tests.ps1 b/test/powershell/engine/ExperimentalFeature/ExperimentalFeature.Basic.Tests.ps1
index 2e86672b3a..8568edf5c9 100644
--- a/test/powershell/engine/ExperimentalFeature/ExperimentalFeature.Basic.Tests.ps1
+++ b/test/powershell/engine/ExperimentalFeature/ExperimentalFeature.Basic.Tests.ps1
@@ -236,7 +236,7 @@ Describe "Experimental Feature Basic Tests - Feature-Enabled" -Tag "CI" {
$command = Get-Command $Name
$command.CommandType | Should -Be $CommandType
## Common parameters + '-Name' + '-SwitchOne' + '-SwitchTwo'
- $command.Parameters.Count | Should -Be ($CommonParameterCount + 3)
+ $command.Parameters.Count | Should -Be ($CommonParameterCount + 3) -Because ($command.Parameters.Keys -join ", ")
$command.ParameterSets.Count | Should -Be 3
& $Name -Name Joe | Should -BeExactly "Hello World Joe."
@@ -254,7 +254,7 @@ Describe "Experimental Feature Basic Tests - Feature-Enabled" -Tag "CI" {
## Common parameters + '-UserName', '-ComputerName', '-ConfigurationName', '-VMName', '-Port',
## '-Token', '-WebSocketUrl', '-ThrottleLimit' and '-Command'
- $command.Parameters.Count | Should -Be ($CommonParameterCount + 9)
+ $command.Parameters.Count | Should -Be ($CommonParameterCount + 9) -Because ($command.Parameters.Keys -join ", ")
$command.ParameterSets.Count | Should -Be 3
$command.Parameters["UserName"].ParameterSets.Count | Should -Be 1
@@ -316,7 +316,7 @@ Describe "Experimental Feature Basic Tests - Feature-Enabled" -Tag "CI" {
$command = Get-Command $Name
$command.CommandType | Should -Be $CommandType
## Common parameters + '-ComputerName'
- $command.Parameters.Count | Should -Be ($CommonParameterCount + 1)
+ $command.Parameters.Count | Should -Be ($CommonParameterCount + 1) -Because ($command.Parameters.Keys -join ", ")
$command.Parameters["ComputerName"].ParameterType.FullName | Should -BeExactly "System.String"
$command.Parameters.ContainsKey("SessionName") | Should -BeFalse
}
@@ -329,7 +329,7 @@ Describe "Experimental Feature Basic Tests - Feature-Enabled" -Tag "CI" {
$command = Get-Command $Name
$command.CommandType | Should -Be $CommandType
## Common parameters + '-ByUrl', '-ByRadio', '-FileName', '-Destination'
- $command.Parameters.Count | Should -Be ($CommonParameterCount + 4)
+ $command.Parameters.Count | Should -Be ($CommonParameterCount + 4) -Because ($command.Parameters.Keys -join ", ")
$command.ParameterSets.Count | Should -Be 2
$command.Parameters["ByUrl"].ParameterSets.Count | Should -Be 1
@@ -358,7 +358,7 @@ Describe "Experimental Feature Basic Tests - Feature-Enabled" -Tag "CI" {
$command = Get-Command $Name
$command.CommandType | Should -Be $CommandType
## Common parameters + '-Name' (dynamic parameters are not triggered)
- $command.Parameters.Count | Should -Be ($CommonParameterCount + 1)
+ $command.Parameters.Count | Should -Be ($CommonParameterCount + 1) -Because ($command.Parameters.Keys -join ", ")
$command.Parameters["Name"] | Should -Not -BeNullOrEmpty
$command = Get-Command $Name -ArgumentList "Joe"