From 3669a9b0999bcbcb49da44ff5859c3a647fd0f7d Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Tue, 6 Sep 2022 13:58:33 -0700 Subject: [PATCH 1/2] Revert "Add `-StrictMode` to `Invoke-Command` to allow specifying strict mode when invoking command locally (#16545)" This reverts commit ed6e0588c8395d779159df537b3d6c5320e0689c. --- .../ExperimentalFeature.cs | 4 - .../remoting/commands/InvokeCommandCommand.cs | 122 ++---------------- .../Invoke-Command.Tests.ps1 | 41 ------ 3 files changed, 13 insertions(+), 154 deletions(-) delete mode 100644 test/powershell/Modules/Microsoft.PowerShell.Core/Invoke-Command.Tests.ps1 diff --git a/src/System.Management.Automation/engine/ExperimentalFeature/ExperimentalFeature.cs b/src/System.Management.Automation/engine/ExperimentalFeature/ExperimentalFeature.cs index 8a3e428b9c4..524d21d896a 100644 --- a/src/System.Management.Automation/engine/ExperimentalFeature/ExperimentalFeature.cs +++ b/src/System.Management.Automation/engine/ExperimentalFeature/ExperimentalFeature.cs @@ -27,7 +27,6 @@ public class ExperimentalFeature internal const string PSCleanBlockFeatureName = "PSCleanBlock"; internal const string PSAMSIMethodInvocationLogging = "PSAMSIMethodInvocationLogging"; internal const string PSExecFeatureName = "PSExec"; - internal const string PSStrictModeAssignment = "PSStrictModeAssignment"; #endregion @@ -140,9 +139,6 @@ static ExperimentalFeature() new ExperimentalFeature( name: PSExecFeatureName, description: "Add 'exec' built-in command on Linux and macOS"), - new ExperimentalFeature( - name: PSStrictModeAssignment, - description: "Add support of setting Strict-Mode with Invoke-Command"), }; EngineExperimentalFeatures = new ReadOnlyCollection(engineFeatures); diff --git a/src/System.Management.Automation/engine/remoting/commands/InvokeCommandCommand.cs b/src/System.Management.Automation/engine/remoting/commands/InvokeCommandCommand.cs index 804355d2e8d..a2a2397cb7a 100644 --- a/src/System.Management.Automation/engine/remoting/commands/InvokeCommandCommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/InvokeCommandCommand.cs @@ -263,72 +263,6 @@ public override SwitchParameter UseSSL } } - private sealed class ArgumentToPSVersionTransformationAttribute : ArgumentToVersionTransformationAttribute - { - protected override bool TryConvertFromString(string versionString, [NotNullWhen(true)] out Version version) - { - if (string.Equals("off", versionString, StringComparison.OrdinalIgnoreCase)) - { - version = new Version(0, 0); - return true; - } - - if (string.Equals("latest", versionString, StringComparison.OrdinalIgnoreCase)) - { - version = PSVersionInfo.PSVersion; - return true; - } - - return base.TryConvertFromString(versionString, out version); - } - } - - private static readonly Version s_OffVersion = new Version(0, 0); - - private sealed class ValidateVersionAttribute : ValidateArgumentsAttribute - { - protected override void Validate(object arguments, EngineIntrinsics engineIntrinsics) - { - Version version = arguments as Version; - if (version == s_OffVersion) - { - return; - } - - if (version == null || !PSVersionInfo.IsValidPSVersion(version)) - { - // No conversion succeeded so throw an exception... - throw new ValidationMetadataException( - "InvalidPSVersion", - null, - Metadata.ValidateVersionFailure, - arguments); - } - } - } - - /// - /// Gets or sets strict mode. - /// - [Experimental(ExperimentalFeature.PSStrictModeAssignment, ExperimentAction.Show)] - [Parameter(ParameterSetName = InvokeCommandCommand.InProcParameterSet)] - [ArgumentToPSVersionTransformation] - [ValidateVersion] - public Version StrictMode - { - get - { - return _strictmodeversion; - } - - set - { - _strictmodeversion = value; - } - } - - private Version _strictmodeversion = null; - /// /// For WSMan session: /// If this parameter is not specified then the value specified in @@ -908,8 +842,6 @@ public virtual SwitchParameter RemoteDebug #endregion - private Version _savedStrictModeVersion; - #endregion Parameters #region Overrides @@ -1033,12 +965,6 @@ protected override void BeginProcessing() } } - if (_strictmodeversion != null) - { - _savedStrictModeVersion = Context.EngineSessionState.CurrentScope.StrictModeVersion; - Context.EngineSessionState.CurrentScope.StrictModeVersion = _strictmodeversion; - } - return; } @@ -1255,19 +1181,7 @@ protected override void ProcessRecord() } else if (ParameterSetName.Equals(InvokeCommandCommand.InProcParameterSet) && (_steppablePipeline != null)) { - try - { - _steppablePipeline.Process(InputObject); - } - catch - { - if (_strictmodeversion != null) - { - Context.EngineSessionState.CurrentScope.StrictModeVersion = _savedStrictModeVersion; - } - - throw; - } + _steppablePipeline.Process(InputObject); } else { @@ -1298,30 +1212,20 @@ protected override void EndProcessing() { if (ParameterSetName.Equals(InvokeCommandCommand.InProcParameterSet)) { - try - { - if (_steppablePipeline != null) - { - _steppablePipeline.End(); - } - else - { - ScriptBlock.InvokeUsingCmdlet( - contextCmdlet: this, - useLocalScope: !NoNewScope, - errorHandlingBehavior: ScriptBlock.ErrorHandlingBehavior.WriteToCurrentErrorPipe, - dollarUnder: AutomationNull.Value, - input: _input, - scriptThis: AutomationNull.Value, - args: ArgumentList); - } + if (_steppablePipeline != null) + { + _steppablePipeline.End(); } - finally + else { - if (_strictmodeversion != null) - { - Context.EngineSessionState.CurrentScope.StrictModeVersion = _savedStrictModeVersion; - } + ScriptBlock.InvokeUsingCmdlet( + contextCmdlet: this, + useLocalScope: !NoNewScope, + errorHandlingBehavior: ScriptBlock.ErrorHandlingBehavior.WriteToCurrentErrorPipe, + dollarUnder: AutomationNull.Value, + input: _input, + scriptThis: AutomationNull.Value, + args: ArgumentList); } } else diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Invoke-Command.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Invoke-Command.Tests.ps1 deleted file mode 100644 index 1765e5d8217..00000000000 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Invoke-Command.Tests.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -Describe "Invoke-Command" -Tags "CI" { - Context "StrictMode tests" { - BeforeAll { - $skipTest = !($EnabledExperimentalFeatures -contains "PSStrictModeAssignment"); - If (Test-Path Variable:InvokeCommand__Test) { - Remove-Item Variable:InvokeCommand__Test - } - } - - It "Setting -StrictMode parameter with uninitialized variable throws error" -skip:$skipTest { - { Invoke-Command -StrictMode 3.0 {$InvokeCommand__Test} } | Should -Throw -ErrorId 'VariableIsUndefined' - } - - It "Setting -StrictMode parameter with initialized variable does not throw error" -skip:$skipTest { - $InvokeCommand__Test = 'Something' - Invoke-Command -StrictMode 3.0 {$InvokeCommand__Test} | Should -Be 'Something' - Remove-Item Variable:InvokeCommand__Test - } - - It "-StrictMode parameter sets StrictMode back to original state after process completes" -skip:$skipTest { - { Invoke-Command -StrictMode 3.0 {$InvokeCommand__Test} } | Should -Throw -ErrorId 'VariableIsUndefined' - { Invoke-Command {$InvokeCommand__Test} } | Should -Not -Throw - } - - It "-StrictMode parameter works on piped input" -skip:$skipTest { - "There" | Invoke-Command -ScriptBlock { "Hello $input" } -StrictMode 3.0 | Should -Be 'Hello There' - { "There" | Invoke-Command -ScriptBlock { "Hello $InvokeCommand__Test" } -StrictMode 3.0 } | Should -Throw -ErrorId 'VariableIsUndefined' - } - - It "-StrictMode latest works" -skip:$skipTest { - { Invoke-Command -StrictMode latest {$InvokeCommand__Test} } | Should -Throw -ErrorId 'VariableIsUndefined' - } - - It "-StrictMode off works" -skip:$skipTest { - { Invoke-Command -StrictMode off {$InvokeCommand__Test} } | Should -Not -Throw - } - } -} From 09602769e22ea50cfde73839cc205530036b0967 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Tue, 6 Sep 2022 14:01:07 -0700 Subject: [PATCH 2/2] remove from experimental features json --- experimental-feature-linux.json | 1 - experimental-feature-windows.json | 1 - 2 files changed, 2 deletions(-) diff --git a/experimental-feature-linux.json b/experimental-feature-linux.json index b0a5a696381..561e7b46c43 100644 --- a/experimental-feature-linux.json +++ b/experimental-feature-linux.json @@ -8,6 +8,5 @@ "PSNativeCommandArgumentPassing", "PSNativeCommandErrorActionPreference", "PSRemotingSSHTransportErrorHandling", - "PSStrictModeAssignment", "PSSubsystemPluginModel" ] diff --git a/experimental-feature-windows.json b/experimental-feature-windows.json index b0a5a696381..561e7b46c43 100644 --- a/experimental-feature-windows.json +++ b/experimental-feature-windows.json @@ -8,6 +8,5 @@ "PSNativeCommandArgumentPassing", "PSNativeCommandErrorActionPreference", "PSRemotingSSHTransportErrorHandling", - "PSStrictModeAssignment", "PSSubsystemPluginModel" ]