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 + } + } }