mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Add ItemSeparator and AltItemSeparator properties in ProviderInfo (#8587)
Add two properties in `ProviderInfo` class: `ItemSeparator` and `AltItemSeparator`. On windows, the default values for those two properties are `ItemSeparator = '\'` and `AltItemSeparator = '/'`. On unix, the default values for those two properties are `ItemSeparator = '/'` and `AltItemSeparator = '\'`. Registry provider is the only exception, both properties for it have the value `\`.
This commit is contained in:
committed by
Dongbo Wang
parent
34fa5e472d
commit
75da390d1e
@@ -942,6 +942,7 @@ namespace Microsoft.PowerShell.Commands
|
||||
StoreLocation.LocalMachine);
|
||||
WriteItemObject(outStore, path, true);
|
||||
}
|
||||
|
||||
#region DriveCmdletProvider overrides
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -259,6 +259,16 @@ namespace System.Management.Automation
|
||||
/// </summary>
|
||||
public bool VolumeSeparatedByColon { get; internal set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the default item separator character for this provider.
|
||||
/// </summary>
|
||||
public char ItemSeparator { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the alternate item separator character for this provider.
|
||||
/// </summary>
|
||||
public char AltItemSeparator { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -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,
|
||||
|
||||
@@ -316,6 +316,7 @@ namespace Microsoft.PowerShell.Commands
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion protected members
|
||||
|
||||
}
|
||||
|
||||
@@ -340,8 +340,9 @@ namespace Microsoft.PowerShell.Commands
|
||||
#endregion
|
||||
|
||||
#region CmdletProvider members
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the default item separator character for this provider.
|
||||
/// </summary>
|
||||
public virtual char ItemSeparator => Path.DirectorySeparatorChar;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the alternate item separator character for this provider.
|
||||
/// </summary>
|
||||
public virtual char AltItemSeparator =>
|
||||
#if UNIX
|
||||
Utils.Separators.Backslash[0];
|
||||
#else
|
||||
Path.AltDirectorySeparatorChar;
|
||||
#endif
|
||||
|
||||
#region IResourceSupplier
|
||||
/// <summary>
|
||||
/// Gets the resource string corresponding to baseName and
|
||||
|
||||
@@ -86,6 +86,15 @@ namespace Microsoft.PowerShell.Commands
|
||||
/// </summary>
|
||||
public const string ProviderName = "Registry";
|
||||
|
||||
#region CmdletProvider overrides
|
||||
|
||||
/// <summary>
|
||||
/// Gets the alternate item separator character for this provider.
|
||||
/// </summary>
|
||||
public override char AltItemSeparator => ItemSeparator;
|
||||
|
||||
#endregion
|
||||
|
||||
#region DriveCmdletProvider overrides
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -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> 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> provider' -TestCases $testCases {
|
||||
param ($Provider, $ItemSeparator, $AltItemSeparator)
|
||||
|
||||
{ (Get-PSProvider $Provider).ItemSeparator = $null } | Should -Throw
|
||||
{ (Get-PSProvider $Provider).AltItemSeparator = $null } | Should -Throw
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user