diff --git a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs
index 10bc7d8225..4a4bce37c2 100644
--- a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs
+++ b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs
@@ -942,6 +942,7 @@ namespace Microsoft.PowerShell.Commands
StoreLocation.LocalMachine);
WriteItemObject(outStore, path, true);
}
+
#region DriveCmdletProvider overrides
///
diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs
index 7c17a961b7..27f8c4f13d 100644
--- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs
+++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs
@@ -259,6 +259,16 @@ namespace System.Management.Automation
///
public bool VolumeSeparatedByColon { get; internal set; } = true;
+ ///
+ /// Gets the default item separator character for this provider.
+ ///
+ 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
/// as a template.
@@ -292,6 +302,8 @@ namespace System.Management.Automation
PSSnapIn = providerInfo.PSSnapIn;
_sessionState = providerInfo._sessionState;
VolumeSeparatedByColon = providerInfo.VolumeSeparatedByColon;
+ ItemSeparator = providerInfo.ItemSeparator;
+ AltItemSeparator = providerInfo.AltItemSeparator;
}
///
@@ -606,6 +618,8 @@ namespace System.Management.Automation
}
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 97fbbffb0c..3ce1bc8a21 100644
--- a/src/System.Management.Automation/namespaces/AliasProvider.cs
+++ b/src/System.Management.Automation/namespaces/AliasProvider.cs
@@ -316,6 +316,7 @@ namespace Microsoft.PowerShell.Commands
return result;
}
+
#endregion protected members
}
diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs
index b62454ac5c..278049098c 100644
--- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs
+++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs
@@ -340,8 +340,9 @@ namespace Microsoft.PowerShell.Commands
#endregion
#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,7 +355,7 @@ namespace Microsoft.PowerShell.Commands
protected override ProviderInfo Start(ProviderInfo providerInfo)
{
// Set the home folder for the user
- if (providerInfo != null && string.IsNullOrEmpty(providerInfo.Home))
+ if (providerInfo != null && 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/ProviderBase.cs b/src/System.Management.Automation/namespaces/ProviderBase.cs
index 8aa48b954d..7e46fc1f46 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;
@@ -1384,6 +1385,21 @@ namespace System.Management.Automation.Provider
}
}
+ ///
+ /// 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 =>
+#if UNIX
+ Utils.Separators.Backslash[0];
+#else
+ Path.AltDirectorySeparatorChar;
+#endif
+
#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 bc3dfd7693..0de52140d0 100644
--- a/src/System.Management.Automation/namespaces/RegistryProvider.cs
+++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs
@@ -86,6 +86,15 @@ namespace Microsoft.PowerShell.Commands
///
public const string ProviderName = "Registry";
+ #region CmdletProvider overrides
+
+ ///
+ /// Gets the alternate item separator character for this provider.
+ ///
+ public override char AltItemSeparator => ItemSeparator;
+
+ #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 f339f38c15..10019e709c 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,43 @@ Describe "Get-PSProvider" -Tags "CI" {
{ $actual | Format-List } | Should -Not -Throw
}
+
+ Context 'ItemSeparator properties' {
+ BeforeAll {
+ $testCases = if ($IsWindows) {
+ @(
+ @{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'; ItemSeparator = '/'; AltItemSeparator = '\'}
+ @{Provider = 'Variable'; ItemSeparator = '/'; AltItemSeparator = '\'}
+ @{Provider = 'Function'; ItemSeparator = '/'; AltItemSeparator = '\'}
+ @{Provider = 'Alias'; ItemSeparator = '/'; AltItemSeparator = '\'}
+ @{Provider = 'Environment'; ItemSeparator = '/'; AltItemSeparator = '\'}
+ )
+ }
+ }
+
+ It ' provider has ItemSeparator properties' -TestCases $testCases {
+ param ($Provider, $ItemSeparator, $AltItemSeparator)
+
+ (Get-PSProvider $Provider).ItemSeparator | Should -Be $ItemSeparator
+ (Get-PSProvider $Provider).AltItemSeparator | Should -Be $AltItemSeparator
+ }
+
+ It 'ItemSeparator properties is read-only in provider' -TestCases $testCases {
+ param ($Provider, $ItemSeparator, $AltItemSeparator)
+
+ { (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 93ad0f557b..7c23de92bf 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
+ }
+ }
}