From 66946e8aa1b0e0b3dfe0bfe3da1df47982c41e0b Mon Sep 17 00:00:00 2001 From: Rene Hernandez Remedios Date: Wed, 2 Jan 2019 16:26:15 -0500 Subject: [PATCH 01/18] Add PathSeparator property in ProviderInfo --- .../engine/DataStoreAdapterProvider.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index 7c17a961b70..5fa986140f7 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -258,6 +258,14 @@ public override string ToString() /// non-windows platforms. /// public bool VolumeSeparatedByColon { get; internal set; } = true; + + /// + /// Gets or sets the path separators characters for this provider + /// + /// + /// Array of strings representing the path separators for this provider + /// + public string[] PathSeparator { get; internal set; } = {}; /// /// Constructs an instance of the class using an existing reference From d21868a82bd5f1404fdc43ce6375a7082f399ff7 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Remedios Date: Wed, 2 Jan 2019 17:00:48 -0500 Subject: [PATCH 02/18] Copy PathSeparator property in copy ctor --- .../engine/DataStoreAdapterProvider.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index 5fa986140f7..8b277bf8c13 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -300,6 +300,7 @@ protected ProviderInfo(ProviderInfo providerInfo) PSSnapIn = providerInfo.PSSnapIn; _sessionState = providerInfo._sessionState; VolumeSeparatedByColon = providerInfo.VolumeSeparatedByColon; + PathSeparator = providerInfo.PathSeparator; } /// From 251723a86f94e36c89e1135db344f3e59c90721d Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Wed, 2 Jan 2019 21:33:11 -0500 Subject: [PATCH 03/18] Set PathSeparator for providers Add PathSeparator values for FileSystem, Function, Variable and Registry providers Add corresponding tests --- .../namespaces/FileSystemProvider.cs | 28 +++++++++++-------- .../namespaces/FunctionProvider.cs | 23 +++++++++++++++ .../namespaces/RegistryProvider.cs | 23 +++++++++++++++ .../namespaces/VariableProvider.cs | 23 +++++++++++++++ .../Get-PSProvider.Tests.ps1 | 24 ++++++++++++++++ 5 files changed, 109 insertions(+), 12 deletions(-) diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs index b62454ac5ce..45cf59cd6ca 100644 --- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs +++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs @@ -341,7 +341,7 @@ public string GetHelpMaml(string helpItemName, string path) #region CmdletProvider members /// - /// Starts the File System provider. This method sets the Home for the + /// Starts the File System provider. This method sets the Home for the /// provider to providerInfo.Home if specified, and %USERPROFILE% /// otherwise. /// @@ -354,21 +354,25 @@ public string GetHelpMaml(string helpItemName, string path) protected override ProviderInfo Start(ProviderInfo providerInfo) { // Set the home folder for the user - if (providerInfo != null && string.IsNullOrEmpty(providerInfo.Home)) + if (providerInfo != null) { - // %USERPROFILE% - indicate where a user's home directory is located in the file system. - string homeDirectory = Environment.GetEnvironmentVariable(Platform.CommonEnvVariableNames.Home); + providerInfo.PathSeparator = new [] { "\\" , "/" }; - if (!string.IsNullOrEmpty(homeDirectory)) - { - if (Directory.Exists(homeDirectory)) + if (string.IsNullOrEmpty(providerInfo.Home)) { + // %USERPROFILE% - indicate where a user's home directory is located in the file system. + string homeDirectory = Environment.GetEnvironmentVariable(Platform.CommonEnvVariableNames.Home); + + if (!string.IsNullOrEmpty(homeDirectory)) { - s_tracer.WriteLine("Home = {0}", homeDirectory); - providerInfo.Home = homeDirectory; - } - else + if (Directory.Exists(homeDirectory)) + { + s_tracer.WriteLine("Home = {0}", homeDirectory); + providerInfo.Home = homeDirectory; + } + else { - s_tracer.WriteLine("Not setting home directory {0} - does not exist", homeDirectory); + s_tracer.WriteLine("Not setting home directory {0} - does not exist", homeDirectory); + } } } } diff --git a/src/System.Management.Automation/namespaces/FunctionProvider.cs b/src/System.Management.Automation/namespaces/FunctionProvider.cs index a15bbbe621b..7e3e6c77b7b 100644 --- a/src/System.Management.Automation/namespaces/FunctionProvider.cs +++ b/src/System.Management.Automation/namespaces/FunctionProvider.cs @@ -41,6 +41,29 @@ public FunctionProvider() #endregion Constructor + #region CmdletProvider overrides + + /// + /// Starts the Function provider. It sets the PathSeparator information + /// + /// + /// The ProviderInfo object that holds the provider's configuration. + /// + /// + /// The updated ProviderInfo object that holds the provider's configuration. + /// + protected override ProviderInfo Start(ProviderInfo providerInfo) + { + if (providerInfo != null) + { + providerInfo.PathSeparator = new [] { "\\", "/" }; + } + + return providerInfo; + } + + #endregion + #region DriveCmdletProvider overrides /// diff --git a/src/System.Management.Automation/namespaces/RegistryProvider.cs b/src/System.Management.Automation/namespaces/RegistryProvider.cs index bc3dfd7693e..73feec07ff7 100644 --- a/src/System.Management.Automation/namespaces/RegistryProvider.cs +++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs @@ -86,6 +86,29 @@ public sealed partial class RegistryProvider : /// public const string ProviderName = "Registry"; + #region CmdletProvider overrides + + /// + /// Starts the Registry provider. It sets the PathSeparator information + /// + /// + /// The ProviderInfo object that holds the provider's configuration. + /// + /// + /// The updated ProviderInfo object that holds the provider's configuration. + /// + protected override ProviderInfo Start(ProviderInfo providerInfo) + { + if (providerInfo != null) + { + providerInfo.PathSeparator = new [] { "\\" }; + } + + return providerInfo; + } + + #endregion + #region DriveCmdletProvider overrides /// diff --git a/src/System.Management.Automation/namespaces/VariableProvider.cs b/src/System.Management.Automation/namespaces/VariableProvider.cs index 693231c9ea0..c2f371756dd 100644 --- a/src/System.Management.Automation/namespaces/VariableProvider.cs +++ b/src/System.Management.Automation/namespaces/VariableProvider.cs @@ -40,6 +40,29 @@ public VariableProvider() #endregion Constructor + #region CmdletProvider overrides + + /// + /// Starts the Variable provider. It sets the PathSeparator information + /// + /// + /// The ProviderInfo object that holds the provider's configuration. + /// + /// + /// The updated ProviderInfo object that holds the provider's configuration. + /// + protected override ProviderInfo Start(ProviderInfo providerInfo) + { + if (providerInfo != null) + { + providerInfo.PathSeparator = new [] { "\\", "/" }; + } + + return providerInfo; + } + + #endregion + #region DriveCmdletProvider overrides /// diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 index f339f38c153..a45f8b1afa9 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 @@ -24,4 +24,28 @@ Describe "Get-PSProvider" -Tags "CI" { { $actual | Format-List } | Should -Not -Throw } + + Context 'FileSystem provider' { + It 'has PathSeparator property' { + (Get-PSProvider FileSystem).PathSeparator | Should -Be @("\", "/") + } + } + + Context 'Registry provider' { + It 'has PathSeparator property' { + (Get-PSProvider Registry).PathSeparator | Should -Be @("\") + } + } + + Context 'Variable provider' { + It 'has PathSeparator property' { + (Get-PSProvider Variable).PathSeparator | Should -Be @("\", "/") + } + } + + Context 'Function provider' { + It 'has PathSeparator property' { + (Get-PSProvider Function).PathSeparator | Should -Be @("\", "/") + } + } } From 64dcd1e0bde3fe4bb4ddc4402cfa0cf8b7dada06 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Wed, 2 Jan 2019 22:02:09 -0500 Subject: [PATCH 04/18] Fix codefactor issues --- .../namespaces/FileSystemProvider.cs | 7 ++++--- .../namespaces/FunctionProvider.cs | 4 ++-- .../namespaces/RegistryProvider.cs | 4 ++-- .../namespaces/VariableProvider.cs | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs index 45cf59cd6ca..c591897c593 100644 --- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs +++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs @@ -343,7 +343,7 @@ public string GetHelpMaml(string helpItemName, string path) /// /// Starts the File System provider. This method sets the Home for the /// provider to providerInfo.Home if specified, and %USERPROFILE% - /// otherwise. + /// otherwise. It also sets the PathSeparator property. /// /// /// The ProviderInfo object that holds the provider's configuration. @@ -356,9 +356,10 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) // Set the home folder for the user if (providerInfo != null) { - providerInfo.PathSeparator = new [] { "\\" , "/" }; + providerInfo.PathSeparator = new[] { "\\", "/" }; - if (string.IsNullOrEmpty(providerInfo.Home)) { + if (string.IsNullOrEmpty(providerInfo.Home)) + { // %USERPROFILE% - indicate where a user's home directory is located in the file system. string homeDirectory = Environment.GetEnvironmentVariable(Platform.CommonEnvVariableNames.Home); diff --git a/src/System.Management.Automation/namespaces/FunctionProvider.cs b/src/System.Management.Automation/namespaces/FunctionProvider.cs index 7e3e6c77b7b..badf208ec35 100644 --- a/src/System.Management.Automation/namespaces/FunctionProvider.cs +++ b/src/System.Management.Automation/namespaces/FunctionProvider.cs @@ -44,7 +44,7 @@ public FunctionProvider() #region CmdletProvider overrides /// - /// Starts the Function provider. It sets the PathSeparator information + /// Starts the Function provider. It sets the PathSeparator property. /// /// /// The ProviderInfo object that holds the provider's configuration. @@ -56,7 +56,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = new [] { "\\", "/" }; + providerInfo.PathSeparator = new[] { "\\", "/" }; } return providerInfo; diff --git a/src/System.Management.Automation/namespaces/RegistryProvider.cs b/src/System.Management.Automation/namespaces/RegistryProvider.cs index 73feec07ff7..0dc8b261c38 100644 --- a/src/System.Management.Automation/namespaces/RegistryProvider.cs +++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs @@ -89,7 +89,7 @@ public sealed partial class RegistryProvider : #region CmdletProvider overrides /// - /// Starts the Registry provider. It sets the PathSeparator information + /// Starts the Registry provider. It sets the PathSeparator property. /// /// /// The ProviderInfo object that holds the provider's configuration. @@ -101,7 +101,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = new [] { "\\" }; + providerInfo.PathSeparator = new[] { "\\" }; } return providerInfo; diff --git a/src/System.Management.Automation/namespaces/VariableProvider.cs b/src/System.Management.Automation/namespaces/VariableProvider.cs index c2f371756dd..0cc958e9c68 100644 --- a/src/System.Management.Automation/namespaces/VariableProvider.cs +++ b/src/System.Management.Automation/namespaces/VariableProvider.cs @@ -43,7 +43,7 @@ public VariableProvider() #region CmdletProvider overrides /// - /// Starts the Variable provider. It sets the PathSeparator information + /// Starts the Variable provider. It sets the PathSeparator property. /// /// /// The ProviderInfo object that holds the provider's configuration. @@ -55,7 +55,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = new [] { "\\", "/" }; + providerInfo.PathSeparator = new[] { "\\", "/" }; } return providerInfo; From 22cfe9d7c6f06cf97f7b6a4d97c920d026788ef4 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Wed, 2 Jan 2019 22:12:38 -0500 Subject: [PATCH 05/18] Fix codefactors issues --- .../engine/DataStoreAdapterProvider.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index 8b277bf8c13..847c5d012e5 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -260,12 +260,12 @@ public override string ToString() public bool VolumeSeparatedByColon { get; internal set; } = true; /// - /// Gets or sets the path separators characters for this provider + /// Gets the path separators characters for this provider. /// /// - /// Array of strings representing the path separators for this provider + /// Array of strings representing the path separators characters for this provider. /// - public string[] PathSeparator { get; internal set; } = {}; + public string[] PathSeparator { get; internal set; } = { }; /// /// Constructs an instance of the class using an existing reference From a045ba57d20f969b2eca8f897a54193db18c5bb7 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Wed, 2 Jan 2019 22:24:25 -0500 Subject: [PATCH 06/18] Run Registry provider test only for windows --- .../Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 index a45f8b1afa9..99be44373ed 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 @@ -33,7 +33,9 @@ Describe "Get-PSProvider" -Tags "CI" { Context 'Registry provider' { It 'has PathSeparator property' { - (Get-PSProvider Registry).PathSeparator | Should -Be @("\") + if ($IsWindows) { + (Get-PSProvider Registry).PathSeparator | Should -Be @("\") + } } } From dd9cf7526690d5423c04f7f915f82630b1d83779 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Sun, 6 Jan 2019 13:26:07 -0500 Subject: [PATCH 07/18] Change PathSeparator property to ReadOnlyCollection Fix that changes in a copy of the separator array could affect subsequent calls of the PathSeparator property Add test --- .../engine/DataStoreAdapterProvider.cs | 28 ++++++++++++++++++- .../namespaces/FileSystemProvider.cs | 2 +- .../namespaces/FunctionProvider.cs | 2 +- .../namespaces/RegistryProvider.cs | 2 +- .../namespaces/VariableProvider.cs | 2 +- .../Get-PSProvider.Tests.ps1 | 13 +++++++++ 6 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index 847c5d012e5..8cfc9c46a54 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -265,7 +265,7 @@ public override string ToString() /// /// Array of strings representing the path separators characters for this provider. /// - public string[] PathSeparator { get; internal set; } = { }; + public ReadOnlyCollection PathSeparator { get; internal set; } = new ReadOnlyCollection(new List()); /// /// Constructs an instance of the class using an existing reference @@ -671,5 +671,31 @@ internal PSNoteProperty GetNotePropertyForProviderCmdlets(string name) return _noteProperty; } } + + internal static class ProviderInfoPathSeparators + { + public static readonly ReadOnlyCollection FileSystem = new ReadOnlyCollection( + new List { + StringLiterals.DefaultPathSeparatorString, + StringLiterals.AlternatePathSeparatorString + }); + + public static readonly ReadOnlyCollection Variable = new ReadOnlyCollection( + new List { + StringLiterals.DefaultPathSeparatorString, + StringLiterals.AlternatePathSeparatorString + }); + + public static readonly ReadOnlyCollection Function = new ReadOnlyCollection( + new List { + StringLiterals.DefaultPathSeparatorString, + StringLiterals.AlternatePathSeparatorString + }); + + public static readonly ReadOnlyCollection Registry = new ReadOnlyCollection( + new List { + StringLiterals.DefaultPathSeparatorString, + }); + } } diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs index c591897c593..7b78e2c1cef 100644 --- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs +++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs @@ -356,7 +356,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) // Set the home folder for the user if (providerInfo != null) { - providerInfo.PathSeparator = new[] { "\\", "/" }; + providerInfo.PathSeparator = ProviderInfoPathSeparators.FileSystem; if (string.IsNullOrEmpty(providerInfo.Home)) { diff --git a/src/System.Management.Automation/namespaces/FunctionProvider.cs b/src/System.Management.Automation/namespaces/FunctionProvider.cs index badf208ec35..b26efbda5e1 100644 --- a/src/System.Management.Automation/namespaces/FunctionProvider.cs +++ b/src/System.Management.Automation/namespaces/FunctionProvider.cs @@ -56,7 +56,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = new[] { "\\", "/" }; + providerInfo.PathSeparator = ProviderInfoPathSeparators.Function; } return providerInfo; diff --git a/src/System.Management.Automation/namespaces/RegistryProvider.cs b/src/System.Management.Automation/namespaces/RegistryProvider.cs index 0dc8b261c38..cdca5825814 100644 --- a/src/System.Management.Automation/namespaces/RegistryProvider.cs +++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs @@ -101,7 +101,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = new[] { "\\" }; + providerInfo.PathSeparator = ProviderInfoPathSeparators.Registry; } return providerInfo; diff --git a/src/System.Management.Automation/namespaces/VariableProvider.cs b/src/System.Management.Automation/namespaces/VariableProvider.cs index 0cc958e9c68..8a3912843c3 100644 --- a/src/System.Management.Automation/namespaces/VariableProvider.cs +++ b/src/System.Management.Automation/namespaces/VariableProvider.cs @@ -55,7 +55,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = new[] { "\\", "/" }; + providerInfo.PathSeparator = ProviderInfoPathSeparators.Variable; } return providerInfo; diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 index 99be44373ed..24ab29138d2 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 @@ -29,6 +29,19 @@ Describe "Get-PSProvider" -Tags "CI" { It 'has PathSeparator property' { (Get-PSProvider FileSystem).PathSeparator | Should -Be @("\", "/") } + + It 'changes on copy do not affect original PathSeparator' { + $separator = (Get-PSProvider FileSystem).PathSeparator + { $separator[0] = "w" } | Should -Throw + + # copying to a new object + $copy = @("", "") + $separator.CopyTo($copy, 0) + + $copy[0] = "w" + + (Get-PSProvider FileSystem).PathSeparator | Should -Be @("\", "/") + } } Context 'Registry provider' { From a27fda6483a7064ae64010375848eb9c358a3d54 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Sun, 6 Jan 2019 14:39:00 -0500 Subject: [PATCH 08/18] Refactor tests to use parameterized data Use test data accordingly to OS, ie. windows vs Unix-like Fix expected values for providers for unix-like system --- .../Get-PSProvider.Tests.ps1 | 67 +++++++++++-------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 index 24ab29138d2..49f480bf1aa 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 @@ -25,42 +25,55 @@ Describe "Get-PSProvider" -Tags "CI" { { $actual | Format-List } | Should -Not -Throw } - Context 'FileSystem provider' { - It 'has PathSeparator property' { - (Get-PSProvider FileSystem).PathSeparator | Should -Be @("\", "/") - } + Context 'PathSeparators' { + BeforeAll { + $windowsTestCases = @( + @{Provider = 'FileSystem'; Value = @("\", "/")} + @{Provider = 'Variable'; Value = @("\", "/")} + @{Provider = 'Function'; Value = @("\", "/")} + @{Provider = 'Registry'; Value = @("\")} + ) - It 'changes on copy do not affect original PathSeparator' { - $separator = (Get-PSProvider FileSystem).PathSeparator - { $separator[0] = "w" } | Should -Throw + $nonWindowsTestCases = @( + @{Provider = 'FileSystem'; Value = @("/", "\")} + @{Provider = 'Variable'; Value = @("/", "\")} + @{Provider = 'Function'; Value = @("/", "\")} + ) - # copying to a new object - $copy = @("", "") - $separator.CopyTo($copy, 0) + $testCases = if ($IsWindows) { + $windowsTestCases + } + else { + $nonWindowsTestCases + } + } - $copy[0] = "w" + It ' provider has PathSeparator property' -TestCases $testCases { + param ($Provider, $Value) - (Get-PSProvider FileSystem).PathSeparator | Should -Be @("\", "/") + (Get-PSProvider $Provider).PathSeparator | Should -Be $Value } - } - Context 'Registry provider' { - It 'has PathSeparator property' { - if ($IsWindows) { - (Get-PSProvider Registry).PathSeparator | Should -Be @("\") - } - } - } + It 'cannot modify PathSeparator collection in provider' -TestCases $testCases { + param ($Provider, $Value) + + $separator = (Get-PSProvider $Provider).PathSeparator - Context 'Variable provider' { - It 'has PathSeparator property' { - (Get-PSProvider Variable).PathSeparator | Should -Be @("\", "/") + { $separator[0] = "w" } | Should -Throw } - } - Context 'Function provider' { - It 'has PathSeparator property' { - (Get-PSProvider Function).PathSeparator | Should -Be @("\", "/") + It 'copying and modifying values does not affect PathSeparator property in provider' -TestCases $testCases { + param ($Provider, $Value) + + $separator = (Get-PSProvider $Provider).PathSeparator + + # copying to a new object + $copy = @("", "") + $separator.CopyTo($copy, 0) + + $copy[0] = "w" + + (Get-PSProvider $Provider).PathSeparator | Should -Be $Value } } } From e217c18151f419e5788ad44b5035fb386a3f34c4 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Sun, 6 Jan 2019 14:43:26 -0500 Subject: [PATCH 09/18] Fix codefactors style issues --- .../engine/DataStoreAdapterProvider.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index 8cfc9c46a54..9fa29f55d63 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -675,25 +675,29 @@ internal PSNoteProperty GetNotePropertyForProviderCmdlets(string name) internal static class ProviderInfoPathSeparators { public static readonly ReadOnlyCollection FileSystem = new ReadOnlyCollection( - new List { + new List + { StringLiterals.DefaultPathSeparatorString, StringLiterals.AlternatePathSeparatorString }); public static readonly ReadOnlyCollection Variable = new ReadOnlyCollection( - new List { + new List + { StringLiterals.DefaultPathSeparatorString, StringLiterals.AlternatePathSeparatorString }); public static readonly ReadOnlyCollection Function = new ReadOnlyCollection( - new List { + new List + { StringLiterals.DefaultPathSeparatorString, StringLiterals.AlternatePathSeparatorString }); public static readonly ReadOnlyCollection Registry = new ReadOnlyCollection( - new List { + new List + { StringLiterals.DefaultPathSeparatorString, }); } From dce3142b30ce62bfb657465d0a6a28b0f6393fd4 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Mon, 4 Mar 2019 16:15:23 -0800 Subject: [PATCH 10/18] Remove extra white space characters --- .../engine/DataStoreAdapterProvider.cs | 26 +++++++++---------- .../namespaces/FunctionProvider.cs | 2 +- .../namespaces/VariableProvider.cs | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index 9fa29f55d63..9b2acaa28be 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -258,7 +258,7 @@ public override string ToString() /// non-windows platforms. /// public bool VolumeSeparatedByColon { get; internal set; } = true; - + /// /// Gets the path separators characters for this provider. /// @@ -686,20 +686,20 @@ internal static class ProviderInfoPathSeparators { StringLiterals.DefaultPathSeparatorString, StringLiterals.AlternatePathSeparatorString - }); - - public static readonly ReadOnlyCollection Function = new ReadOnlyCollection( - new List - { - StringLiterals.DefaultPathSeparatorString, + }); + + public static readonly ReadOnlyCollection Function = new ReadOnlyCollection( + new List + { + StringLiterals.DefaultPathSeparatorString, StringLiterals.AlternatePathSeparatorString - }); + }); - public static readonly ReadOnlyCollection Registry = new ReadOnlyCollection( - new List - { - StringLiterals.DefaultPathSeparatorString, - }); + public static readonly ReadOnlyCollection Registry = new ReadOnlyCollection( + new List + { + StringLiterals.DefaultPathSeparatorString, + }); } } diff --git a/src/System.Management.Automation/namespaces/FunctionProvider.cs b/src/System.Management.Automation/namespaces/FunctionProvider.cs index b26efbda5e1..3ccbec7dce2 100644 --- a/src/System.Management.Automation/namespaces/FunctionProvider.cs +++ b/src/System.Management.Automation/namespaces/FunctionProvider.cs @@ -61,7 +61,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) return providerInfo; } - + #endregion #region DriveCmdletProvider overrides diff --git a/src/System.Management.Automation/namespaces/VariableProvider.cs b/src/System.Management.Automation/namespaces/VariableProvider.cs index 8a3912843c3..7c6c8a0aefc 100644 --- a/src/System.Management.Automation/namespaces/VariableProvider.cs +++ b/src/System.Management.Automation/namespaces/VariableProvider.cs @@ -60,7 +60,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) return providerInfo; } - + #endregion #region DriveCmdletProvider overrides From c067d7340990d6673bf66d4f0694d9a3d69315bb Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Thu, 7 Mar 2019 07:09:58 -0500 Subject: [PATCH 11/18] Apply changes requested by daxian Add PathSeparator property to Env, Cert and Alias provider Add test for property being read-only Consolidate separator list in Separators class --- .../security/CertificateProvider.cs | 24 ++++++++++++++ .../engine/DataStoreAdapterProvider.cs | 32 +------------------ .../engine/Utils.cs | 14 ++++++++ .../namespaces/AliasProvider.cs | 24 ++++++++++++++ .../namespaces/EnvironmentProvider.cs | 23 +++++++++++++ .../namespaces/FileSystemProvider.cs | 2 +- .../namespaces/FunctionProvider.cs | 2 +- .../namespaces/RegistryProvider.cs | 2 +- .../namespaces/VariableProvider.cs | 2 +- .../Get-PSProvider.Tests.ps1 | 22 ++++++++++--- 10 files changed, 107 insertions(+), 40 deletions(-) diff --git a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs index 10bc7d8225f..e7652696173 100644 --- a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs +++ b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs @@ -942,6 +942,7 @@ protected override void NewItem( StoreLocation.LocalMachine); WriteItemObject(outStore, path, true); } + #region DriveCmdletProvider overrides /// @@ -2237,6 +2238,29 @@ protected override object GetChildItemsDynamicParameters(string path, bool recur #endregion DriveCmdletProvider overrides + #region CmdletProvider overrides + + /// + /// Starts the Certificate provider. It sets the PathSeparator property. + /// + /// + /// The ProviderInfo object that holds the provider's configuration. + /// + /// + /// The updated ProviderInfo object that holds the provider's configuration. + /// + protected override ProviderInfo Start(ProviderInfo providerInfo) + { + if (providerInfo != null) + { + providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; + } + + return providerInfo; + } + + #endregion + #region private members /// diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index 9b2acaa28be..aaf7b67af0e 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -263,7 +263,7 @@ public override string ToString() /// Gets the path separators characters for this provider. /// /// - /// Array of strings representing the path separators characters for this provider. + /// Read-only collection of strings representing the path separators characters for this provider. /// public ReadOnlyCollection PathSeparator { get; internal set; } = new ReadOnlyCollection(new List()); @@ -671,35 +671,5 @@ internal PSNoteProperty GetNotePropertyForProviderCmdlets(string name) return _noteProperty; } } - - internal static class ProviderInfoPathSeparators - { - public static readonly ReadOnlyCollection FileSystem = new ReadOnlyCollection( - new List - { - StringLiterals.DefaultPathSeparatorString, - StringLiterals.AlternatePathSeparatorString - }); - - public static readonly ReadOnlyCollection Variable = new ReadOnlyCollection( - new List - { - StringLiterals.DefaultPathSeparatorString, - StringLiterals.AlternatePathSeparatorString - }); - - public static readonly ReadOnlyCollection Function = new ReadOnlyCollection( - new List - { - StringLiterals.DefaultPathSeparatorString, - StringLiterals.AlternatePathSeparatorString - }); - - public static readonly ReadOnlyCollection Registry = new ReadOnlyCollection( - new List - { - StringLiterals.DefaultPathSeparatorString, - }); - } } diff --git a/src/System.Management.Automation/engine/Utils.cs b/src/System.Management.Automation/engine/Utils.cs index f4520be4b80..fd584a871eb 100644 --- a/src/System.Management.Automation/engine/Utils.cs +++ b/src/System.Management.Automation/engine/Utils.cs @@ -1225,6 +1225,20 @@ private static class EmptyReadOnlyCollectionHolder internal static class Separators { + + public static readonly ReadOnlyCollection BackAndForwardSlashSeparators = new ReadOnlyCollection( + new List + { + StringLiterals.DefaultPathSeparatorString, + StringLiterals.AlternatePathSeparatorString + }); + + public static readonly ReadOnlyCollection BackSlashOnlySeparators = new ReadOnlyCollection( + new List + { + StringLiterals.DefaultPathSeparatorString, + }); + internal static readonly char[] Backslash = new char[] { '\\' }; internal static readonly char[] Directory = new char[] { '\\', '/' }; internal static readonly char[] DirectoryOrDrive = new char[] { '\\', '/', ':' }; diff --git a/src/System.Management.Automation/namespaces/AliasProvider.cs b/src/System.Management.Automation/namespaces/AliasProvider.cs index 97fbbffb0cb..6659d1a79b9 100644 --- a/src/System.Management.Automation/namespaces/AliasProvider.cs +++ b/src/System.Management.Automation/namespaces/AliasProvider.cs @@ -316,6 +316,30 @@ internal override bool CanRenameItem(object item) return result; } + + #region CmdletProvider overrides + + /// + /// Starts the Alias provider. It sets the PathSeparator property. + /// + /// + /// The ProviderInfo object that holds the provider's configuration. + /// + /// + /// The updated ProviderInfo object that holds the provider's configuration. + /// + protected override ProviderInfo Start(ProviderInfo providerInfo) + { + if (providerInfo != null) + { + providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; + } + + return providerInfo; + } + + #endregion + #endregion protected members } diff --git a/src/System.Management.Automation/namespaces/EnvironmentProvider.cs b/src/System.Management.Automation/namespaces/EnvironmentProvider.cs index 6a9227030e0..d5319fa3249 100644 --- a/src/System.Management.Automation/namespaces/EnvironmentProvider.cs +++ b/src/System.Management.Automation/namespaces/EnvironmentProvider.cs @@ -63,6 +63,29 @@ protected override Collection InitializeDefaultDrives() #endregion DriveCmdletProvider overrides + #region CmdletProvider overrides + + /// + /// Starts the Environment provider. It sets the PathSeparator property. + /// + /// + /// The ProviderInfo object that holds the provider's configuration. + /// + /// + /// The updated ProviderInfo object that holds the provider's configuration. + /// + protected override ProviderInfo Start(ProviderInfo providerInfo) + { + if (providerInfo != null) + { + providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; + } + + return providerInfo; + } + + #endregion + #region protected members /// diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs index 7b78e2c1cef..d66bc8b581f 100644 --- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs +++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs @@ -356,7 +356,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) // Set the home folder for the user if (providerInfo != null) { - providerInfo.PathSeparator = ProviderInfoPathSeparators.FileSystem; + providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; if (string.IsNullOrEmpty(providerInfo.Home)) { diff --git a/src/System.Management.Automation/namespaces/FunctionProvider.cs b/src/System.Management.Automation/namespaces/FunctionProvider.cs index 3ccbec7dce2..a26c4951188 100644 --- a/src/System.Management.Automation/namespaces/FunctionProvider.cs +++ b/src/System.Management.Automation/namespaces/FunctionProvider.cs @@ -56,7 +56,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = ProviderInfoPathSeparators.Function; + providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; } return providerInfo; diff --git a/src/System.Management.Automation/namespaces/RegistryProvider.cs b/src/System.Management.Automation/namespaces/RegistryProvider.cs index cdca5825814..0c8ee80c103 100644 --- a/src/System.Management.Automation/namespaces/RegistryProvider.cs +++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs @@ -101,7 +101,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = ProviderInfoPathSeparators.Registry; + providerInfo.PathSeparator = Utils.Separators.BackSlashOnlySeparators; } return providerInfo; diff --git a/src/System.Management.Automation/namespaces/VariableProvider.cs b/src/System.Management.Automation/namespaces/VariableProvider.cs index 7c6c8a0aefc..8a23fbe5e2f 100644 --- a/src/System.Management.Automation/namespaces/VariableProvider.cs +++ b/src/System.Management.Automation/namespaces/VariableProvider.cs @@ -55,7 +55,7 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) { if (providerInfo != null) { - providerInfo.PathSeparator = ProviderInfoPathSeparators.Variable; + providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; } return providerInfo; diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 index 49f480bf1aa..50d5086b3d5 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 @@ -31,6 +31,9 @@ Describe "Get-PSProvider" -Tags "CI" { @{Provider = 'FileSystem'; Value = @("\", "/")} @{Provider = 'Variable'; Value = @("\", "/")} @{Provider = 'Function'; Value = @("\", "/")} + @{Provider = 'Alias'; Value = @("\", "/")} + @{Provider = 'Environment'; Value = @("\", "/")} + @{Provider = 'Certificate'; Value = @("\", "/")} @{Provider = 'Registry'; Value = @("\")} ) @@ -38,6 +41,9 @@ Describe "Get-PSProvider" -Tags "CI" { @{Provider = 'FileSystem'; Value = @("/", "\")} @{Provider = 'Variable'; Value = @("/", "\")} @{Provider = 'Function'; Value = @("/", "\")} + @{Provider = 'Alias'; Value = @("/", "\")} + @{Provider = 'Environment'; Value = @("/", "\")} + @{Provider = 'Certificate'; Value = @("/", "\")} ) $testCases = if ($IsWindows) { @@ -54,6 +60,12 @@ Describe "Get-PSProvider" -Tags "CI" { (Get-PSProvider $Provider).PathSeparator | Should -Be $Value } + It 'PathSeparator property is read-only in provider' -TestCases $testCases { + param ($Provider, $Value) + + { (Get-PSProvider $Provider).PathSeparator = $null } | Should -Throw + } + It 'cannot modify PathSeparator collection in provider' -TestCases $testCases { param ($Provider, $Value) @@ -67,13 +79,13 @@ Describe "Get-PSProvider" -Tags "CI" { $separator = (Get-PSProvider $Provider).PathSeparator - # copying to a new object - $copy = @("", "") - $separator.CopyTo($copy, 0) + # copying to a new object + $copy = @("", "") + $separator.CopyTo($copy, 0) - $copy[0] = "w" + $copy[0] = "w" - (Get-PSProvider $Provider).PathSeparator | Should -Be $Value + (Get-PSProvider $Provider).PathSeparator | Should -Be $Value } } } From 22df404cdd17496179b2eea11ff7e6b08379e428 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Fri, 8 Mar 2019 06:10:51 -0500 Subject: [PATCH 12/18] Remove intermediate variables --- .../Get-PSProvider.Tests.ps1 | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 index 50d5086b3d5..31e111e6b6d 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 @@ -27,30 +27,26 @@ Describe "Get-PSProvider" -Tags "CI" { Context 'PathSeparators' { BeforeAll { - $windowsTestCases = @( - @{Provider = 'FileSystem'; Value = @("\", "/")} - @{Provider = 'Variable'; Value = @("\", "/")} - @{Provider = 'Function'; Value = @("\", "/")} - @{Provider = 'Alias'; Value = @("\", "/")} - @{Provider = 'Environment'; Value = @("\", "/")} - @{Provider = 'Certificate'; Value = @("\", "/")} - @{Provider = 'Registry'; Value = @("\")} - ) - - $nonWindowsTestCases = @( - @{Provider = 'FileSystem'; Value = @("/", "\")} - @{Provider = 'Variable'; Value = @("/", "\")} - @{Provider = 'Function'; Value = @("/", "\")} - @{Provider = 'Alias'; Value = @("/", "\")} - @{Provider = 'Environment'; Value = @("/", "\")} - @{Provider = 'Certificate'; Value = @("/", "\")} - ) - $testCases = if ($IsWindows) { - $windowsTestCases + @( + @{Provider = 'FileSystem'; Value = @("\", "/")} + @{Provider = 'Variable'; Value = @("\", "/")} + @{Provider = 'Function'; Value = @("\", "/")} + @{Provider = 'Alias'; Value = @("\", "/")} + @{Provider = 'Environment'; Value = @("\", "/")} + @{Provider = 'Certificate'; Value = @("\", "/")} + @{Provider = 'Registry'; Value = @("\")} + ) } else { - $nonWindowsTestCases + @( + @{Provider = 'FileSystem'; Value = @("/", "\")} + @{Provider = 'Variable'; Value = @("/", "\")} + @{Provider = 'Function'; Value = @("/", "\")} + @{Provider = 'Alias'; Value = @("/", "\")} + @{Provider = 'Environment'; Value = @("/", "\")} + @{Provider = 'Certificate'; Value = @("/", "\")} + ) } } From cb175f614fc7b03099be8a847bae8b850bec62dc Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Sat, 9 Mar 2019 13:07:15 -0500 Subject: [PATCH 13/18] Add WSMan path separator property Remove invalid test cases for nonwindows os --- .../ConfigProvider.cs | 29 +++++++++++++++++++ .../engine/DataStoreAdapterProvider.cs | 2 +- .../Get-PSProvider.Tests.ps1 | 1 - 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.WSMan.Management/ConfigProvider.cs b/src/Microsoft.WSMan.Management/ConfigProvider.cs index 237c3eb111f..e60941bc607 100644 --- a/src/Microsoft.WSMan.Management/ConfigProvider.cs +++ b/src/Microsoft.WSMan.Management/ConfigProvider.cs @@ -182,6 +182,35 @@ string ICmdletProviderSupportsHelp.GetHelpMaml(string helpItemName, string path) #endregion + #region CmdletProvider overrides + + /// + /// Starts the Registry provider. It sets the PathSeparator property. + /// + /// + /// The ProviderInfo object that holds the provider's configuration. + /// + /// + /// The updated ProviderInfo object that holds the provider's configuration. + /// + protected override ProviderInfo Start(ProviderInfo providerInfo) + { + if (providerInfo != null) + { + providerInfo.PathSeparator = new ReadOnlyCollection( + new List + { + WSManStringLiterals.DefaultPathSeparator.ToString(), + WSManStringLiterals.AlternatePathSeparator.ToString() + }); + } + + return providerInfo; + } + + #endregion + + #region DriveCmdletProvider /// /// diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index aaf7b67af0e..dc3677b3708 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -265,7 +265,7 @@ public override string ToString() /// /// Read-only collection of strings representing the path separators characters for this provider. /// - public ReadOnlyCollection PathSeparator { get; internal set; } = new ReadOnlyCollection(new List()); + public ReadOnlyCollection PathSeparator { get; set; } = new ReadOnlyCollection(new List()); /// /// Constructs an instance of the class using an existing reference diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 index 31e111e6b6d..6df4ea9f9c0 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 @@ -45,7 +45,6 @@ Describe "Get-PSProvider" -Tags "CI" { @{Provider = 'Function'; Value = @("/", "\")} @{Provider = 'Alias'; Value = @("/", "\")} @{Provider = 'Environment'; Value = @("/", "\")} - @{Provider = 'Certificate'; Value = @("/", "\")} ) } } From 533af4ad6c27faa2b90ded30dd186b276e88ef84 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Wed, 20 Mar 2019 06:38:17 -0400 Subject: [PATCH 14/18] [Feature] Rewrite separator properties Remove unused overrides for Start method Add tests for WSMan in ConfigProvider tests --- .../security/CertificateProvider.cs | 23 ------- .../ConfigProvider.cs | 29 --------- .../engine/DataStoreAdapterProvider.cs | 17 +++-- .../namespaces/AliasProvider.cs | 23 ------- .../namespaces/EnvironmentProvider.cs | 23 ------- .../namespaces/FileSystemProvider.cs | 3 +- .../namespaces/FunctionProvider.cs | 23 ------- .../namespaces/ProviderBase.cs | 12 ++++ .../namespaces/RegistryProvider.cs | 20 +----- .../namespaces/VariableProvider.cs | 23 ------- .../Get-PSProvider.Tests.ps1 | 62 +++++++------------ .../ConfigProvider.Tests.ps1 | 13 ++++ 12 files changed, 61 insertions(+), 210 deletions(-) diff --git a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs index e7652696173..4a4bce37c2b 100644 --- a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs +++ b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs @@ -2238,29 +2238,6 @@ protected override object GetChildItemsDynamicParameters(string path, bool recur #endregion DriveCmdletProvider overrides - #region CmdletProvider overrides - - /// - /// Starts the Certificate provider. It sets the PathSeparator property. - /// - /// - /// The ProviderInfo object that holds the provider's configuration. - /// - /// - /// The updated ProviderInfo object that holds the provider's configuration. - /// - protected override ProviderInfo Start(ProviderInfo providerInfo) - { - if (providerInfo != null) - { - providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; - } - - return providerInfo; - } - - #endregion - #region private members /// diff --git a/src/Microsoft.WSMan.Management/ConfigProvider.cs b/src/Microsoft.WSMan.Management/ConfigProvider.cs index e60941bc607..237c3eb111f 100644 --- a/src/Microsoft.WSMan.Management/ConfigProvider.cs +++ b/src/Microsoft.WSMan.Management/ConfigProvider.cs @@ -182,35 +182,6 @@ string ICmdletProviderSupportsHelp.GetHelpMaml(string helpItemName, string path) #endregion - #region CmdletProvider overrides - - /// - /// Starts the Registry provider. It sets the PathSeparator property. - /// - /// - /// The ProviderInfo object that holds the provider's configuration. - /// - /// - /// The updated ProviderInfo object that holds the provider's configuration. - /// - protected override ProviderInfo Start(ProviderInfo providerInfo) - { - if (providerInfo != null) - { - providerInfo.PathSeparator = new ReadOnlyCollection( - new List - { - WSManStringLiterals.DefaultPathSeparator.ToString(), - WSManStringLiterals.AlternatePathSeparator.ToString() - }); - } - - return providerInfo; - } - - #endregion - - #region DriveCmdletProvider /// /// diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index dc3677b3708..c79034c2beb 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -260,12 +260,14 @@ public override string ToString() public bool VolumeSeparatedByColon { get; internal set; } = true; /// - /// Gets the path separators characters for this provider. + /// Gets the default item separator character for this provider. /// - /// - /// Read-only collection of strings representing the path separators characters for this provider. - /// - public ReadOnlyCollection PathSeparator { get; set; } = new ReadOnlyCollection(new List()); + public char ItemSeparator { get; private set; } + + // + /// Gets the alternate item separator character for this provider. + /// + public char AltItemSeparator { get; private set; } /// /// Constructs an instance of the class using an existing reference @@ -300,7 +302,8 @@ protected ProviderInfo(ProviderInfo providerInfo) PSSnapIn = providerInfo.PSSnapIn; _sessionState = providerInfo._sessionState; VolumeSeparatedByColon = providerInfo.VolumeSeparatedByColon; - PathSeparator = providerInfo.PathSeparator; + ItemSeparator = providerInfo.ItemSeparator; + AltItemSeparator = providerInfo.AltItemSeparator; } /// @@ -615,6 +618,8 @@ internal Provider.CmdletProvider CreateInstance() } Provider.CmdletProvider result = providerInstance as Provider.CmdletProvider; + ItemSeparator = result.ItemSeparator; + AltItemSeparator = result.AltItemSeparator; Dbg.Diagnostics.Assert( result != null, diff --git a/src/System.Management.Automation/namespaces/AliasProvider.cs b/src/System.Management.Automation/namespaces/AliasProvider.cs index 6659d1a79b9..3ce1bc8a219 100644 --- a/src/System.Management.Automation/namespaces/AliasProvider.cs +++ b/src/System.Management.Automation/namespaces/AliasProvider.cs @@ -317,29 +317,6 @@ internal override bool CanRenameItem(object item) return result; } - #region CmdletProvider overrides - - /// - /// Starts the Alias provider. It sets the PathSeparator property. - /// - /// - /// The ProviderInfo object that holds the provider's configuration. - /// - /// - /// The updated ProviderInfo object that holds the provider's configuration. - /// - protected override ProviderInfo Start(ProviderInfo providerInfo) - { - if (providerInfo != null) - { - providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; - } - - return providerInfo; - } - - #endregion - #endregion protected members } diff --git a/src/System.Management.Automation/namespaces/EnvironmentProvider.cs b/src/System.Management.Automation/namespaces/EnvironmentProvider.cs index d5319fa3249..6a9227030e0 100644 --- a/src/System.Management.Automation/namespaces/EnvironmentProvider.cs +++ b/src/System.Management.Automation/namespaces/EnvironmentProvider.cs @@ -63,29 +63,6 @@ protected override Collection InitializeDefaultDrives() #endregion DriveCmdletProvider overrides - #region CmdletProvider overrides - - /// - /// Starts the Environment provider. It sets the PathSeparator property. - /// - /// - /// The ProviderInfo object that holds the provider's configuration. - /// - /// - /// The updated ProviderInfo object that holds the provider's configuration. - /// - protected override ProviderInfo Start(ProviderInfo providerInfo) - { - if (providerInfo != null) - { - providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; - } - - return providerInfo; - } - - #endregion - #region protected members /// diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs index d66bc8b581f..dcf77075387 100644 --- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs +++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs @@ -340,6 +340,7 @@ public string GetHelpMaml(string helpItemName, string path) #endregion #region CmdletProvider members + /// /// Starts the File System provider. This method sets the Home for the /// provider to providerInfo.Home if specified, and %USERPROFILE% @@ -356,8 +357,6 @@ protected override ProviderInfo Start(ProviderInfo providerInfo) // Set the home folder for the user if (providerInfo != null) { - providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; - if (string.IsNullOrEmpty(providerInfo.Home)) { // %USERPROFILE% - indicate where a user's home directory is located in the file system. diff --git a/src/System.Management.Automation/namespaces/FunctionProvider.cs b/src/System.Management.Automation/namespaces/FunctionProvider.cs index a26c4951188..a15bbbe621b 100644 --- a/src/System.Management.Automation/namespaces/FunctionProvider.cs +++ b/src/System.Management.Automation/namespaces/FunctionProvider.cs @@ -41,29 +41,6 @@ public FunctionProvider() #endregion Constructor - #region CmdletProvider overrides - - /// - /// Starts the Function provider. It sets the PathSeparator property. - /// - /// - /// The ProviderInfo object that holds the provider's configuration. - /// - /// - /// The updated ProviderInfo object that holds the provider's configuration. - /// - protected override ProviderInfo Start(ProviderInfo providerInfo) - { - if (providerInfo != null) - { - providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; - } - - return providerInfo; - } - - #endregion - #region DriveCmdletProvider overrides /// diff --git a/src/System.Management.Automation/namespaces/ProviderBase.cs b/src/System.Management.Automation/namespaces/ProviderBase.cs index 8aa48b954d0..ffc3c916705 100644 --- a/src/System.Management.Automation/namespaces/ProviderBase.cs +++ b/src/System.Management.Automation/namespaces/ProviderBase.cs @@ -8,10 +8,12 @@ using System.Management.Automation.Runspaces; using System.Management.Automation.Internal; using System.Management.Automation.Host; +using System.Management.Automation; using System.Reflection; using System.Resources; using System.Diagnostics.CodeAnalysis; // for fxcop using System.Security.AccessControl; +using System.IO; namespace System.Management.Automation.Provider { @@ -1384,6 +1386,16 @@ public PSHost Host } } + /// + /// Gets the default item separator character for this provider. + /// + public virtual char ItemSeparator => Path.DirectorySeparatorChar; + + // + /// Gets the alternate item separator character for this provider. + /// + public virtual char AltItemSeparator => Path.AltDirectorySeparatorChar; + #region IResourceSupplier /// /// Gets the resource string corresponding to baseName and diff --git a/src/System.Management.Automation/namespaces/RegistryProvider.cs b/src/System.Management.Automation/namespaces/RegistryProvider.cs index 0c8ee80c103..d1e6f4d1062 100644 --- a/src/System.Management.Automation/namespaces/RegistryProvider.cs +++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs @@ -88,24 +88,10 @@ public sealed partial class RegistryProvider : #region CmdletProvider overrides - /// - /// Starts the Registry provider. It sets the PathSeparator property. + // + /// Gets the alternate item separator character for this provider. /// - /// - /// The ProviderInfo object that holds the provider's configuration. - /// - /// - /// The updated ProviderInfo object that holds the provider's configuration. - /// - protected override ProviderInfo Start(ProviderInfo providerInfo) - { - if (providerInfo != null) - { - providerInfo.PathSeparator = Utils.Separators.BackSlashOnlySeparators; - } - - return providerInfo; - } + public override char AltItemSeparator => base.ItemSeparator; #endregion diff --git a/src/System.Management.Automation/namespaces/VariableProvider.cs b/src/System.Management.Automation/namespaces/VariableProvider.cs index 8a23fbe5e2f..693231c9ea0 100644 --- a/src/System.Management.Automation/namespaces/VariableProvider.cs +++ b/src/System.Management.Automation/namespaces/VariableProvider.cs @@ -40,29 +40,6 @@ public VariableProvider() #endregion Constructor - #region CmdletProvider overrides - - /// - /// Starts the Variable provider. It sets the PathSeparator property. - /// - /// - /// The ProviderInfo object that holds the provider's configuration. - /// - /// - /// The updated ProviderInfo object that holds the provider's configuration. - /// - protected override ProviderInfo Start(ProviderInfo providerInfo) - { - if (providerInfo != null) - { - providerInfo.PathSeparator = Utils.Separators.BackAndForwardSlashSeparators; - } - - return providerInfo; - } - - #endregion - #region DriveCmdletProvider overrides /// diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 index 6df4ea9f9c0..10019e709ca 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSProvider.Tests.ps1 @@ -25,62 +25,42 @@ Describe "Get-PSProvider" -Tags "CI" { { $actual | Format-List } | Should -Not -Throw } - Context 'PathSeparators' { + Context 'ItemSeparator properties' { BeforeAll { $testCases = if ($IsWindows) { @( - @{Provider = 'FileSystem'; Value = @("\", "/")} - @{Provider = 'Variable'; Value = @("\", "/")} - @{Provider = 'Function'; Value = @("\", "/")} - @{Provider = 'Alias'; Value = @("\", "/")} - @{Provider = 'Environment'; Value = @("\", "/")} - @{Provider = 'Certificate'; Value = @("\", "/")} - @{Provider = 'Registry'; Value = @("\")} + @{Provider = 'FileSystem'; ItemSeparator = '\'; AltItemSeparator = '/'} + @{Provider = 'Variable'; ItemSeparator = '\'; AltItemSeparator = '/'} + @{Provider = 'Function'; ItemSeparator = '\'; AltItemSeparator = '/'} + @{Provider = 'Alias'; ItemSeparator = '\'; AltItemSeparator = '/'} + @{Provider = 'Environment'; ItemSeparator = '\'; AltItemSeparator = '/'} + @{Provider = 'Certificate'; ItemSeparator = '\'; AltItemSeparator = '/'} + @{Provider = 'Registry'; ItemSeparator = '\'; AltItemSeparator = '\'} ) } else { @( - @{Provider = 'FileSystem'; Value = @("/", "\")} - @{Provider = 'Variable'; Value = @("/", "\")} - @{Provider = 'Function'; Value = @("/", "\")} - @{Provider = 'Alias'; Value = @("/", "\")} - @{Provider = 'Environment'; Value = @("/", "\")} + @{Provider = 'FileSystem'; ItemSeparator = '/'; AltItemSeparator = '\'} + @{Provider = 'Variable'; ItemSeparator = '/'; AltItemSeparator = '\'} + @{Provider = 'Function'; ItemSeparator = '/'; AltItemSeparator = '\'} + @{Provider = 'Alias'; ItemSeparator = '/'; AltItemSeparator = '\'} + @{Provider = 'Environment'; ItemSeparator = '/'; AltItemSeparator = '\'} ) } } - It ' provider has PathSeparator property' -TestCases $testCases { - param ($Provider, $Value) + It ' provider has ItemSeparator properties' -TestCases $testCases { + param ($Provider, $ItemSeparator, $AltItemSeparator) - (Get-PSProvider $Provider).PathSeparator | Should -Be $Value + (Get-PSProvider $Provider).ItemSeparator | Should -Be $ItemSeparator + (Get-PSProvider $Provider).AltItemSeparator | Should -Be $AltItemSeparator } - It 'PathSeparator property is read-only in provider' -TestCases $testCases { - param ($Provider, $Value) + It 'ItemSeparator properties is read-only in provider' -TestCases $testCases { + param ($Provider, $ItemSeparator, $AltItemSeparator) - { (Get-PSProvider $Provider).PathSeparator = $null } | Should -Throw - } - - It 'cannot modify PathSeparator collection in provider' -TestCases $testCases { - param ($Provider, $Value) - - $separator = (Get-PSProvider $Provider).PathSeparator - - { $separator[0] = "w" } | Should -Throw - } - - It 'copying and modifying values does not affect PathSeparator property in provider' -TestCases $testCases { - param ($Provider, $Value) - - $separator = (Get-PSProvider $Provider).PathSeparator - - # copying to a new object - $copy = @("", "") - $separator.CopyTo($copy, 0) - - $copy[0] = "w" - - (Get-PSProvider $Provider).PathSeparator | Should -Be $Value + { (Get-PSProvider $Provider).ItemSeparator = $null } | Should -Throw + { (Get-PSProvider $Provider).AltItemSeparator = $null } | Should -Throw } } } diff --git a/test/powershell/Modules/Microsoft.WSMan.Management/ConfigProvider.Tests.ps1 b/test/powershell/Modules/Microsoft.WSMan.Management/ConfigProvider.Tests.ps1 index 93ad0f557bb..7c23de92bf3 100644 --- a/test/powershell/Modules/Microsoft.WSMan.Management/ConfigProvider.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.WSMan.Management/ConfigProvider.Tests.ps1 @@ -439,4 +439,17 @@ Describe "WSMan Config Provider" -Tag Feature,RequireAdminOnWindows { } } } + + Context 'ItemSeparator properties' { + It 'WSMan provider has ItemSeparator properties' { + + (Get-PSProvider WSMan).ItemSeparator | Should -Be '\' + (Get-PSProvider WSMan).AltItemSeparator | Should -Be '/' + } + + It 'ItemSeparator properties is read-only in WSMan provider' { + { (Get-PSProvider WSMan).ItemSeparator = $null } | Should -Throw + { (Get-PSProvider WSMan).AltItemSeparator = $null } | Should -Throw + } + } } From f7c411cf7a7cb32a60fc98218b7d3c2732d1b6f1 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Wed, 20 Mar 2019 07:13:20 -0400 Subject: [PATCH 15/18] [Feature] Apply codefactor fixes Remove unused properties added to internal Separator class Fix xml documentation --- src/System.Management.Automation/engine/Utils.cs | 14 -------------- .../namespaces/ProviderBase.cs | 3 +-- .../namespaces/RegistryProvider.cs | 2 +- 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/src/System.Management.Automation/engine/Utils.cs b/src/System.Management.Automation/engine/Utils.cs index fd584a871eb..f4520be4b80 100644 --- a/src/System.Management.Automation/engine/Utils.cs +++ b/src/System.Management.Automation/engine/Utils.cs @@ -1225,20 +1225,6 @@ private static class EmptyReadOnlyCollectionHolder internal static class Separators { - - public static readonly ReadOnlyCollection BackAndForwardSlashSeparators = new ReadOnlyCollection( - new List - { - StringLiterals.DefaultPathSeparatorString, - StringLiterals.AlternatePathSeparatorString - }); - - public static readonly ReadOnlyCollection BackSlashOnlySeparators = new ReadOnlyCollection( - new List - { - StringLiterals.DefaultPathSeparatorString, - }); - internal static readonly char[] Backslash = new char[] { '\\' }; internal static readonly char[] Directory = new char[] { '\\', '/' }; internal static readonly char[] DirectoryOrDrive = new char[] { '\\', '/', ':' }; diff --git a/src/System.Management.Automation/namespaces/ProviderBase.cs b/src/System.Management.Automation/namespaces/ProviderBase.cs index ffc3c916705..591c5d32b1c 100644 --- a/src/System.Management.Automation/namespaces/ProviderBase.cs +++ b/src/System.Management.Automation/namespaces/ProviderBase.cs @@ -8,7 +8,6 @@ using System.Management.Automation.Runspaces; using System.Management.Automation.Internal; using System.Management.Automation.Host; -using System.Management.Automation; using System.Reflection; using System.Resources; using System.Diagnostics.CodeAnalysis; // for fxcop @@ -1391,7 +1390,7 @@ public PSHost Host /// public virtual char ItemSeparator => Path.DirectorySeparatorChar; - // + /// /// Gets the alternate item separator character for this provider. /// public virtual char AltItemSeparator => Path.AltDirectorySeparatorChar; diff --git a/src/System.Management.Automation/namespaces/RegistryProvider.cs b/src/System.Management.Automation/namespaces/RegistryProvider.cs index d1e6f4d1062..776fe4e8ccc 100644 --- a/src/System.Management.Automation/namespaces/RegistryProvider.cs +++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs @@ -88,7 +88,7 @@ public sealed partial class RegistryProvider : #region CmdletProvider overrides - // + /// /// Gets the alternate item separator character for this provider. /// public override char AltItemSeparator => base.ItemSeparator; From 63348ae75549cf4187a62a960fbc7026a013474f Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Wed, 20 Mar 2019 07:35:55 -0400 Subject: [PATCH 16/18] [Feature] More codefactor fixes Remove unused namespace Fix xml documentation tag Remove base prefix from expression body --- .../engine/DataStoreAdapterProvider.cs | 2 +- src/System.Management.Automation/namespaces/ProviderBase.cs | 2 +- src/System.Management.Automation/namespaces/RegistryProvider.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index c79034c2beb..27f8c4f13de 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -264,7 +264,7 @@ public override string ToString() /// public char ItemSeparator { get; private set; } - // + /// /// Gets the alternate item separator character for this provider. /// public char AltItemSeparator { get; private set; } diff --git a/src/System.Management.Automation/namespaces/ProviderBase.cs b/src/System.Management.Automation/namespaces/ProviderBase.cs index 591c5d32b1c..015b9cf570d 100644 --- a/src/System.Management.Automation/namespaces/ProviderBase.cs +++ b/src/System.Management.Automation/namespaces/ProviderBase.cs @@ -5,6 +5,7 @@ #pragma warning disable 56506 using System.Collections.ObjectModel; +using System.IO; using System.Management.Automation.Runspaces; using System.Management.Automation.Internal; using System.Management.Automation.Host; @@ -12,7 +13,6 @@ using System.Resources; using System.Diagnostics.CodeAnalysis; // for fxcop using System.Security.AccessControl; -using System.IO; namespace System.Management.Automation.Provider { diff --git a/src/System.Management.Automation/namespaces/RegistryProvider.cs b/src/System.Management.Automation/namespaces/RegistryProvider.cs index 776fe4e8ccc..0de52140d06 100644 --- a/src/System.Management.Automation/namespaces/RegistryProvider.cs +++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs @@ -91,7 +91,7 @@ public sealed partial class RegistryProvider : /// /// Gets the alternate item separator character for this provider. /// - public override char AltItemSeparator => base.ItemSeparator; + public override char AltItemSeparator => ItemSeparator; #endregion From a45280df57bd313413d51a04630f6ac12d2e0fdb Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Fri, 22 Mar 2019 06:30:35 -0400 Subject: [PATCH 17/18] [Feature] Remove no longer applicable changes --- .../namespaces/FileSystemProvider.cs | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs index dcf77075387..278049098c1 100644 --- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs +++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs @@ -344,7 +344,7 @@ public string GetHelpMaml(string helpItemName, string path) /// /// Starts the File System provider. This method sets the Home for the /// provider to providerInfo.Home if specified, and %USERPROFILE% - /// otherwise. It also sets the PathSeparator property. + /// otherwise. /// /// /// The ProviderInfo object that holds the provider's configuration. @@ -355,24 +355,21 @@ public string GetHelpMaml(string helpItemName, string path) protected override ProviderInfo Start(ProviderInfo providerInfo) { // Set the home folder for the user - if (providerInfo != null) + if (providerInfo != null && string.IsNullOrEmpty(providerInfo.Home)) { - if (string.IsNullOrEmpty(providerInfo.Home)) - { - // %USERPROFILE% - indicate where a user's home directory is located in the file system. - string homeDirectory = Environment.GetEnvironmentVariable(Platform.CommonEnvVariableNames.Home); + // %USERPROFILE% - indicate where a user's home directory is located in the file system. + string homeDirectory = Environment.GetEnvironmentVariable(Platform.CommonEnvVariableNames.Home); - if (!string.IsNullOrEmpty(homeDirectory)) - { - if (Directory.Exists(homeDirectory)) - { - s_tracer.WriteLine("Home = {0}", homeDirectory); - providerInfo.Home = homeDirectory; - } - else + if (!string.IsNullOrEmpty(homeDirectory)) + { + if (Directory.Exists(homeDirectory)) { - s_tracer.WriteLine("Not setting home directory {0} - does not exist", homeDirectory); + s_tracer.WriteLine("Home = {0}", homeDirectory); + providerInfo.Home = homeDirectory; } + else + { + s_tracer.WriteLine("Not setting home directory {0} - does not exist", homeDirectory); } } } From a905ca0f1f57172ff4593c4e579fe4778f4a2aa8 Mon Sep 17 00:00:00 2001 From: Rene Hernandez Date: Fri, 29 Mar 2019 19:41:17 -0400 Subject: [PATCH 18/18] [Feature] Switch to use Utils.Separators in Unix environment Rebase from master --- .../namespaces/ProviderBase.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/System.Management.Automation/namespaces/ProviderBase.cs b/src/System.Management.Automation/namespaces/ProviderBase.cs index 015b9cf570d..7e46fc1f467 100644 --- a/src/System.Management.Automation/namespaces/ProviderBase.cs +++ b/src/System.Management.Automation/namespaces/ProviderBase.cs @@ -1393,7 +1393,12 @@ public PSHost Host /// /// Gets the alternate item separator character for this provider. /// - public virtual char AltItemSeparator => Path.AltDirectorySeparatorChar; + public virtual char AltItemSeparator => +#if UNIX + Utils.Separators.Backslash[0]; +#else + Path.AltDirectorySeparatorChar; +#endif #region IResourceSupplier ///