diff --git a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs
index 10bc7d8225f..4a4bce37c2b 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
///
diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs
index 7c17a961b70..27f8c4f13de 100644
--- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs
+++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs
@@ -259,6 +259,16 @@ public override string ToString()
///
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 @@ protected ProviderInfo(ProviderInfo providerInfo)
PSSnapIn = providerInfo.PSSnapIn;
_sessionState = providerInfo._sessionState;
VolumeSeparatedByColon = providerInfo.VolumeSeparatedByColon;
+ ItemSeparator = providerInfo.ItemSeparator;
+ AltItemSeparator = providerInfo.AltItemSeparator;
}
///
@@ -606,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 97fbbffb0cb..3ce1bc8a219 100644
--- a/src/System.Management.Automation/namespaces/AliasProvider.cs
+++ b/src/System.Management.Automation/namespaces/AliasProvider.cs
@@ -316,6 +316,7 @@ internal override bool CanRenameItem(object item)
return result;
}
+
#endregion protected members
}
diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs
index b62454ac5ce..278049098c1 100644
--- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs
+++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs
@@ -340,8 +340,9 @@ public string GetHelpMaml(string helpItemName, string path)
#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 @@ 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 && 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 8aa48b954d0..7e46fc1f467 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 @@ 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 =>
+#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 bc3dfd7693e..0de52140d06 100644
--- a/src/System.Management.Automation/namespaces/RegistryProvider.cs
+++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs
@@ -86,6 +86,15 @@ public sealed partial class RegistryProvider :
///
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 f339f38c153..10019e709ca 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 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
+ }
+ }
}