mirror of
https://github.com/aphrody-labs/PowerShell.git
synced 2026-10-17 04:36:39 +00:00
5322 lines
168 KiB
C#
5322 lines
168 KiB
C#
/********************************************************************++
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
--********************************************************************/
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Management.Automation;
|
|
using System.Management.Automation.Internal;
|
|
using System.Management.Automation.Provider;
|
|
using System.Threading;
|
|
using Dbg = System.Management.Automation;
|
|
|
|
namespace Microsoft.PowerShell.Commands
|
|
{
|
|
#region CoreCommandBase
|
|
|
|
/// <summary>
|
|
/// The base command for the core commands.
|
|
/// </summary>
|
|
public abstract class CoreCommandBase : PSCmdlet, IDynamicParameters
|
|
{
|
|
#region Tracer
|
|
|
|
/// <summary>
|
|
/// An instance of the PSTraceSource class used for trace output
|
|
/// using "NavigationCommands" as the category.
|
|
/// </summary>
|
|
///
|
|
[Dbg.TraceSourceAttribute ("NavigationCommands", "The namespace navigation tracer")]
|
|
internal static Dbg.PSTraceSource tracer = Dbg.PSTraceSource.GetTracer ("NavigationCommands", "The namespace navigation tracer");
|
|
|
|
#endregion Tracer
|
|
|
|
#region Protected members
|
|
|
|
/// <summary>
|
|
/// The context for the command that is passed to the core command providers.
|
|
/// </summary>
|
|
virtual internal CmdletProviderContext CmdletProviderContext
|
|
{
|
|
get
|
|
{
|
|
CmdletProviderContext coreCommandContext = new CmdletProviderContext (this);
|
|
|
|
coreCommandContext.Force = Force;
|
|
|
|
Collection<string> includeFilter =
|
|
SessionStateUtilities.ConvertArrayToCollection<string> (Include);
|
|
|
|
Collection<string> excludeFilter =
|
|
SessionStateUtilities.ConvertArrayToCollection<string> (Exclude);
|
|
|
|
coreCommandContext.SetFilters(includeFilter, excludeFilter, Filter);
|
|
coreCommandContext.SuppressWildcardExpansion = SuppressWildcardExpansion;
|
|
coreCommandContext.DynamicParameters = RetrievedDynamicParameters;
|
|
stopContextCollection.Add(coreCommandContext);
|
|
|
|
return coreCommandContext;
|
|
}
|
|
} // CmdletProviderContext
|
|
|
|
virtual internal SwitchParameter SuppressWildcardExpansion
|
|
{
|
|
get
|
|
{
|
|
return suppressWildcardExpansion;
|
|
}
|
|
set
|
|
{
|
|
suppressWildcardExpansion = value;
|
|
}
|
|
}
|
|
private bool suppressWildcardExpansion;
|
|
|
|
/// <summary>
|
|
/// A virtual method for retrieving the dynamic parameters for a cmdlet. Derived cmdlets
|
|
/// that require dynamic parameters should override this method and return the
|
|
/// dynamic parameter object.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
virtual internal object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called by the base implementation that checks the SupportShouldProcess provider
|
|
/// capability. This virtual method gives the
|
|
/// derived cmdlet a chance query the CmdletProvider capabilities to determine
|
|
/// if the provider supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
virtual protected bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return true;
|
|
}
|
|
} // ProviderSupportsShouldProcess
|
|
|
|
/// <summary>
|
|
/// A helper for derived classes to call to determine if the paths specified
|
|
/// are for a provider that supports ShouldProcess
|
|
/// </summary>
|
|
///
|
|
/// <param name="paths">
|
|
/// The paths to check to see if the providers support ShouldProcess.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// If the paths are to different providers, and any don't support
|
|
/// ShouldProcess, then the return value is false. If they all
|
|
/// support ShouldProcess then the return value is true.
|
|
/// </returns>
|
|
protected bool DoesProviderSupportShouldProcess (string[] paths)
|
|
{
|
|
// If no paths are specified, then default to true as the paths
|
|
// may be getting piped in.
|
|
bool result = true;
|
|
|
|
if (paths != null && paths.Length >= 0)
|
|
{
|
|
foreach (string path in paths)
|
|
{
|
|
ProviderInfo provider = null;
|
|
PSDriveInfo drive = null;
|
|
|
|
// I don't really care about the returned path, just the provider name
|
|
SessionState.Path.GetUnresolvedProviderPathFromPSPath(
|
|
path,
|
|
this.CmdletProviderContext,
|
|
out provider,
|
|
out drive);
|
|
|
|
// Check the provider's capabilities
|
|
|
|
if (!CmdletProviderManagementIntrinsics.CheckProviderCapabilities(
|
|
ProviderCapabilities.ShouldProcess,
|
|
provider))
|
|
{
|
|
result = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The dynamic parameters which have already been retrieved from the provider
|
|
/// and bound by the command processor.
|
|
/// </summary>
|
|
///
|
|
protected internal object RetrievedDynamicParameters
|
|
{
|
|
get
|
|
{
|
|
return dynamicParameters;
|
|
} // get
|
|
} // RetrievedDynamicParameters
|
|
/// <summary>
|
|
/// The dynamic parameters for the command. They are retrieved using the
|
|
/// GetDynamicParameters virtual method.
|
|
/// </summary>
|
|
///
|
|
private object dynamicParameters;
|
|
|
|
#endregion Protected members
|
|
|
|
#region Public members
|
|
|
|
/// <summary>
|
|
/// Stops the processing of the provider by using the
|
|
/// CmdletProviderContext to tunnel the stop message to
|
|
/// the provider instance.
|
|
/// </summary>
|
|
///
|
|
protected override void StopProcessing ()
|
|
{
|
|
foreach (CmdletProviderContext stopContext in stopContextCollection)
|
|
{
|
|
stopContext.StopProcessing();
|
|
}
|
|
} // StopProcessing
|
|
internal Collection<CmdletProviderContext> stopContextCollection =
|
|
new Collection<CmdletProviderContext>();
|
|
|
|
/// <summary>
|
|
/// Gets or sets the filter property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// This is meant to be overridden by derived classes if
|
|
/// they support the Filter parameter. This property is on
|
|
/// the base class to simplify the creation of the CmdletProviderContext.
|
|
/// </remarks>
|
|
///
|
|
virtual public string Filter
|
|
{
|
|
get
|
|
{
|
|
return filter;
|
|
}
|
|
set
|
|
{
|
|
filter = value;
|
|
}
|
|
}
|
|
private string filter;
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the include property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// This is meant to be overridden by derived classes if
|
|
/// they support the Include parameter. This property is on
|
|
/// the base class to simplify the creation of the CmdletProviderContext.
|
|
/// </remarks>
|
|
///
|
|
virtual public string[] Include
|
|
{
|
|
get
|
|
{
|
|
return include;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
include = value;
|
|
} // set
|
|
} // Include
|
|
private string[] include = new string[0];
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the exclude property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// This is meant to be overridden by derived classes if
|
|
/// they support the Exclude parameter. This property is on
|
|
/// the base class to simplify the creation of the CmdletProviderContext.
|
|
/// </remarks>
|
|
///
|
|
virtual public string[] Exclude
|
|
{
|
|
get
|
|
{
|
|
return exclude;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
exclude = value;
|
|
} // set
|
|
} // Exclude
|
|
private string[] exclude = new string[0];
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
///
|
|
/// This is meant to be overridden by derived classes if
|
|
/// they support the Force parameter. This property is on
|
|
/// the base class to simplify the creation of the CmdletProviderContext.
|
|
/// </remarks>
|
|
///
|
|
virtual public SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return force;
|
|
}
|
|
set
|
|
{
|
|
force = value;
|
|
}
|
|
} // Force
|
|
private bool force;
|
|
|
|
|
|
/// <summary>
|
|
/// Retrieves the dynamic parameters for the command from
|
|
/// the provider.
|
|
/// </summary>
|
|
///
|
|
public object GetDynamicParameters()
|
|
{
|
|
// Don't stream errors or Write* to the pipeline.
|
|
CmdletProviderContext context = CmdletProviderContext;
|
|
context.PassThru = false;
|
|
|
|
try
|
|
{
|
|
dynamicParameters = GetDynamicParameters(context);
|
|
}
|
|
catch (ItemNotFoundException)
|
|
{
|
|
dynamicParameters = null;
|
|
}
|
|
catch (ProviderNotFoundException)
|
|
{
|
|
dynamicParameters = null;
|
|
}
|
|
catch (DriveNotFoundException)
|
|
{
|
|
dynamicParameters = null;
|
|
}
|
|
|
|
return dynamicParameters;
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the cmdlet and CmdletProvider supports ShouldProcess
|
|
/// </summary>
|
|
///
|
|
public bool SupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return ProviderSupportsShouldProcess;
|
|
}
|
|
} // SupportsShouldProcess
|
|
|
|
#endregion Public members
|
|
|
|
} // class CoreCommandBase
|
|
|
|
#endregion CoreCommandBase
|
|
|
|
#region CoreCommandWithCredentialsBase
|
|
|
|
/// <summary>
|
|
/// The base class for core commands to extend when they require credentials
|
|
/// to be passed as parameters.
|
|
/// </summary>
|
|
public class CoreCommandWithCredentialsBase : CoreCommandBase
|
|
{
|
|
#region Parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the credential parameter
|
|
/// </summary>
|
|
///
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
[Credential()]
|
|
public PSCredential Credential
|
|
{
|
|
get { return credential; }
|
|
set { credential = value; }
|
|
}
|
|
#endregion Parameters
|
|
|
|
#region parameter data
|
|
|
|
/// <summary>
|
|
/// The credentials to be used for the command.
|
|
/// </summary>
|
|
private PSCredential credential;
|
|
|
|
#endregion parameter data
|
|
|
|
#region Protected members
|
|
|
|
/// <summary>
|
|
/// The context for the command that is passed to the core command providers.
|
|
/// </summary>
|
|
internal override CmdletProviderContext CmdletProviderContext
|
|
{
|
|
get
|
|
{
|
|
CmdletProviderContext coreCommandContext = new CmdletProviderContext (this, Credential);
|
|
coreCommandContext.Force = Force;
|
|
|
|
Collection<string> includeFilter =
|
|
SessionStateUtilities.ConvertArrayToCollection<string> (Include);
|
|
|
|
Collection<string> excludeFilter =
|
|
SessionStateUtilities.ConvertArrayToCollection<string> (Exclude);
|
|
|
|
coreCommandContext.SetFilters(includeFilter, excludeFilter, Filter);
|
|
coreCommandContext.SuppressWildcardExpansion = SuppressWildcardExpansion;
|
|
coreCommandContext.DynamicParameters = RetrievedDynamicParameters;
|
|
stopContextCollection.Add(coreCommandContext);
|
|
|
|
return coreCommandContext;
|
|
}
|
|
} // CmdletProviderContext
|
|
|
|
#endregion Protected members
|
|
|
|
} // CoreCommandWithCredentialsBase
|
|
|
|
#endregion CoreCommandWithCredentialsBase
|
|
|
|
#region GetLocationCommand
|
|
|
|
/// <summary>
|
|
/// The get-location command class.
|
|
/// This command does things like list the contents of a container, get
|
|
/// an item at a given path, get the current working directory, etc.
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// </remarks>
|
|
///
|
|
[Cmdlet (VerbsCommon.Get, "Location", DefaultParameterSetName ="Location", SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113321")]
|
|
[OutputType(typeof(PathInfo), ParameterSetName = new string[] { "locationSet" })]
|
|
[OutputType(typeof(PathInfoStack), ParameterSetName = new string[] { "Stack" })]
|
|
public class GetLocationCommand : DriveMatchingCoreCommandBase
|
|
{
|
|
/// <summary>
|
|
/// The string declaration for the Location parameter set in this command.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// The "Location" parameter set includes the following parameters:
|
|
/// -location
|
|
/// </remarks>
|
|
private const string locationSet = "Location";
|
|
|
|
/// <summary>
|
|
/// The string declaration for the Stack parameter set in this command.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// The "Stack" parameter set includes the following parameters:
|
|
/// -stack
|
|
/// </remarks>
|
|
private const string stackSet = "Stack";
|
|
|
|
#region Command parameters
|
|
|
|
#region Location parameter set parameters
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the provider from which to get the current location.
|
|
/// </summary>
|
|
///
|
|
[Parameter(ParameterSetName= locationSet, ValueFromPipelineByPropertyName = true)]
|
|
public string[] PSProvider
|
|
{
|
|
get
|
|
{
|
|
return provider;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
provider = new string[0];
|
|
}
|
|
else
|
|
{
|
|
provider = value;
|
|
}
|
|
} // set
|
|
} // Provider
|
|
|
|
/// <summary>
|
|
/// Gets or sets the drive from which to get the current location.
|
|
/// </summary>
|
|
///
|
|
[Parameter (ParameterSetName = locationSet, ValueFromPipelineByPropertyName = true)]
|
|
public string[] PSDrive
|
|
{
|
|
get
|
|
{
|
|
return drives;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
drives = value;
|
|
} // set
|
|
} // Drive
|
|
|
|
#endregion Location parameter set parameters
|
|
|
|
#region Stack parameter set parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Stack switch parameter which is used
|
|
/// to disambiguate parameter sets
|
|
/// </summary>
|
|
/// <value></value>
|
|
[Parameter (ParameterSetName = stackSet)]
|
|
public SwitchParameter Stack
|
|
{
|
|
get
|
|
{
|
|
return stackSwitch;
|
|
}
|
|
set
|
|
{
|
|
stackSwitch = value;
|
|
}
|
|
}
|
|
private bool stackSwitch;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the stack ID for the location stack that will
|
|
/// be retrieved.
|
|
/// </summary>
|
|
///
|
|
[Parameter (ParameterSetName = stackSet, ValueFromPipelineByPropertyName = true)]
|
|
public string[] StackName
|
|
{
|
|
get
|
|
{
|
|
return stackNames;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
stackNames = value;
|
|
} // set
|
|
} // StackName
|
|
|
|
#endregion Stack parameter set parameters
|
|
|
|
#endregion Command parameters
|
|
|
|
#region command data
|
|
|
|
|
|
#region Location parameter set data
|
|
|
|
/// <summary>
|
|
/// The name of the provider from which to return the current location.
|
|
/// </summary>
|
|
private string[] provider = new string[0];
|
|
|
|
/// <summary>
|
|
/// The name of the drive from which to return the current location.
|
|
/// </summary>
|
|
private string[] drives;
|
|
|
|
#endregion Location parameter set data
|
|
|
|
#region Stack parameter set data
|
|
|
|
/// <summary>
|
|
/// The name of the location stack from which to return the stack.
|
|
/// </summary>
|
|
private string[] stackNames;
|
|
|
|
#endregion Stack parameter set data
|
|
|
|
|
|
#endregion command data
|
|
|
|
|
|
#region command code
|
|
|
|
/// <summary>
|
|
/// The main execution method for the get-location command. Depending on
|
|
/// the parameter set that is specified, the command can do many things.
|
|
/// -locationSet gets the current working directory as a Monad path
|
|
/// -stackSet gets the directory stack of directories that have been
|
|
/// pushed by the push-location command
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
// It is OK to use a switch for string comparison here because we
|
|
// want a case sensitive comparison in the current culture.
|
|
switch (ParameterSetName)
|
|
{
|
|
case locationSet:
|
|
PathInfo result = null;
|
|
|
|
if (PSDrive != null && PSDrive.Length > 0)
|
|
{
|
|
foreach (string drive in PSDrive)
|
|
{
|
|
List<PSDriveInfo> foundDrives = null;
|
|
try
|
|
{
|
|
foundDrives = GetMatchingDrives(drive, PSProvider, null);
|
|
}
|
|
catch (DriveNotFoundException e)
|
|
{
|
|
ErrorRecord errorRecord =
|
|
new ErrorRecord(
|
|
e,
|
|
"GetLocationNoMatchingDrive",
|
|
ErrorCategory.ObjectNotFound,
|
|
drive);
|
|
WriteError(errorRecord);
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException e)
|
|
{
|
|
ErrorRecord errorRecord =
|
|
new ErrorRecord(
|
|
e,
|
|
"GetLocationNoMatchingProvider",
|
|
ErrorCategory.ObjectNotFound,
|
|
PSProvider);
|
|
WriteError(errorRecord);
|
|
continue;
|
|
}
|
|
catch (ArgumentException argException)
|
|
{
|
|
ErrorRecord errorRecord =
|
|
new ErrorRecord(
|
|
argException,
|
|
"GetLocationNoMatchingDrive",
|
|
ErrorCategory.ObjectNotFound,
|
|
drive);
|
|
WriteError(errorRecord);
|
|
continue;
|
|
}
|
|
|
|
// Get the current location for a specific drive and provider
|
|
|
|
foreach (PSDriveInfo workingDrive in foundDrives)
|
|
{
|
|
try
|
|
{
|
|
string path =
|
|
LocationGlobber.GetDriveQualifiedPath(
|
|
workingDrive.CurrentLocation,
|
|
workingDrive);
|
|
|
|
result = new PathInfo(workingDrive, workingDrive.Provider, path, SessionState);
|
|
|
|
WriteObject(result);
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// If the drive wasn't specified but the provider was
|
|
else if ((PSDrive == null || PSDrive.Length == 0) &&
|
|
(PSProvider != null && PSProvider.Length > 0))
|
|
{
|
|
|
|
foreach (string providerName in PSProvider)
|
|
{
|
|
bool providerContainsWildcard = WildcardPattern.ContainsWildcardCharacters(providerName);
|
|
if (!providerContainsWildcard)
|
|
{
|
|
// Since the Provider was specified and doesn't contain
|
|
// wildcard characters, make sure it exists.
|
|
|
|
try
|
|
{
|
|
SessionState.Provider.GetOne(providerName);
|
|
}
|
|
catch (ProviderNotFoundException e)
|
|
{
|
|
ErrorRecord errorRecord =
|
|
new ErrorRecord(
|
|
e,
|
|
"GetLocationNoMatchingProvider",
|
|
ErrorCategory.ObjectNotFound,
|
|
providerName);
|
|
WriteError(errorRecord);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
// Match the providers
|
|
|
|
foreach (ProviderInfo providerInfo in SessionState.Provider.GetAll())
|
|
{
|
|
if (providerInfo.IsMatch(providerName))
|
|
{
|
|
try
|
|
{
|
|
WriteObject(SessionState.Path.CurrentProviderLocation(providerInfo.FullName));
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
if (providerContainsWildcard)
|
|
{
|
|
// NTRAID#Windows Out Of Band Releases-923607-2005/11/02-JeffJon
|
|
// This exception is ignored, because it just means we didn't find
|
|
// an active drive for the provider.
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
// Get the current working directory using the core command API.
|
|
WriteObject(SessionState.Path.CurrentLocation);
|
|
}
|
|
break;
|
|
|
|
case stackSet:
|
|
if (stackNames != null)
|
|
{
|
|
foreach (string stackName in stackNames)
|
|
{
|
|
try
|
|
{
|
|
// Get the directory stack. This is similar to the "dirs" command
|
|
WriteObject(SessionState.Path.LocationStack(stackName), false);
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
WriteObject(SessionState.Path.LocationStack(null), false);
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
Dbg.Diagnostics.Assert (false, String.Format (System.Globalization.CultureInfo.InvariantCulture, "One of the predefined parameter sets should have been specified, instead we got: {0}", ParameterSetName));
|
|
break;
|
|
} // case (ParameterSetName)
|
|
} // ProcessRecord
|
|
|
|
#endregion command code
|
|
|
|
} // class GetLocationCommand
|
|
#endregion GetLocationCommand
|
|
|
|
|
|
#region SetLocationCommand
|
|
|
|
/// <summary>
|
|
/// The core command for setting/changing location.
|
|
/// This is the equivalent of cd command.
|
|
/// </summary>
|
|
[Cmdlet(VerbsCommon.Set, "Location", DefaultParameterSetName = "Path", SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113397")]
|
|
[OutputType(typeof(PathInfo), typeof(PathInfoStack))]
|
|
public class SetLocationCommand : CoreCommandBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// The string declaration for the Location parameter set in this command.
|
|
/// </summary>
|
|
private const string pathSet = "Path";
|
|
|
|
/// <summary>
|
|
/// The string declaration for the literal location parameter set in this command.
|
|
/// </summary>
|
|
private const string literalPathSet = "LiteralPath";
|
|
|
|
/// <summary>
|
|
/// The string declaration for the Stack parameter set in this command.
|
|
/// </summary>
|
|
private const string stackSet = "Stack";
|
|
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
|
|
/// <summary>
|
|
/// The string declaration for the Relationship parameter set in this command.
|
|
/// </summary>
|
|
private const string relationshipSet = "Relationship";
|
|
#endif
|
|
/// <summary>
|
|
/// Gets or sets the path property
|
|
/// </summary>
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
|
|
[Parameter(Position = 0, ParameterSetName = relationshipSet, ValueFromPipelineByPropertyName = true)]
|
|
#endif
|
|
[Parameter(Position = 0, ParameterSetName = pathSet,
|
|
ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)]
|
|
public string Path
|
|
{
|
|
get
|
|
{
|
|
return path;
|
|
}
|
|
set
|
|
{
|
|
path = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path path property, when bound from the pipeline.
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = literalPathSet,
|
|
Mandatory = true, ValueFromPipeline = false, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return path;
|
|
}
|
|
set
|
|
{
|
|
path = value;
|
|
base.SuppressWildcardExpansion = true;
|
|
}
|
|
} // PSPath
|
|
|
|
/// <summary>
|
|
/// Gets or sets the parameter -passThru which states output from
|
|
/// the command should be placed in the pipeline.
|
|
/// </summary>
|
|
[Parameter]
|
|
public SwitchParameter PassThru
|
|
{
|
|
get
|
|
{
|
|
return passThrough;
|
|
} // get
|
|
set
|
|
{
|
|
passThrough = value;
|
|
} //set
|
|
} // PassThru
|
|
|
|
/// <summary>
|
|
/// Gets or sets the StackName parameter which determines which location stack
|
|
/// to use for the push. If the parameter is missing or empty the default
|
|
/// location stack is used.
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = stackSet, ValueFromPipelineByPropertyName = true)]
|
|
public string StackName
|
|
{
|
|
get
|
|
{
|
|
return stackName;
|
|
} // get
|
|
set
|
|
{
|
|
stackName = value;
|
|
} //set
|
|
} // StackName
|
|
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
|
|
/// <summary>
|
|
/// Gets or sets the relationship Parameter which determines which relationship
|
|
/// to resolve to a path to set-location to.
|
|
/// </summary>
|
|
///
|
|
[Parameter(Mandatory = true, ParameterSetName = relationshipSet, ValueFromPipelineByPropertyName = true)]
|
|
public string Relationship
|
|
{
|
|
get
|
|
{
|
|
return relationship;
|
|
}
|
|
|
|
set
|
|
{
|
|
relationship = value;
|
|
}
|
|
}
|
|
private string relationship = String.Empty;
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Property parameter value
|
|
/// </summary>
|
|
///
|
|
[Parameter(ParameterSetName = relationshipSet, ValueFromPipelineByPropertyName = true)]
|
|
public string Property
|
|
{
|
|
get
|
|
{
|
|
return property;
|
|
}
|
|
|
|
set
|
|
{
|
|
property = value;
|
|
}
|
|
}
|
|
private string property = String.Empty;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Target parameter value
|
|
/// </summary>
|
|
///
|
|
[Parameter (ParameterSetName = relationshipSet, ValueFromPipelineByPropertyName = true)]
|
|
public string Target
|
|
{
|
|
get
|
|
{
|
|
return target;
|
|
}
|
|
|
|
set
|
|
{
|
|
target = value;
|
|
}
|
|
}
|
|
private string target = String.Empty;
|
|
#endif
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
|
|
/// <summary>
|
|
/// The filter used when doing a dir
|
|
/// </summary>
|
|
private string path = String.Empty;
|
|
|
|
/// <summary>
|
|
/// Determines if output should be passed through for
|
|
/// set-location.
|
|
/// </summary>
|
|
private bool passThrough;
|
|
|
|
/// <summary>
|
|
/// The ID of the stack to use for the pop.
|
|
/// </summary>
|
|
private string stackName;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// The functional part of the code that does the changing of the current
|
|
/// working directory.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
object result = null;
|
|
|
|
switch (ParameterSetName)
|
|
{
|
|
case pathSet:
|
|
case literalPathSet:
|
|
try
|
|
{
|
|
// Change the current working directory
|
|
result = SessionState.Path.SetLocation(Path, CmdletProviderContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
}
|
|
break;
|
|
|
|
case stackSet:
|
|
|
|
try
|
|
{
|
|
// Change the default location stack
|
|
result = SessionState.Path.SetDefaultLocationStack(StackName);
|
|
}
|
|
catch (ItemNotFoundException itemNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
itemNotFound.ErrorRecord,
|
|
itemNotFound));
|
|
}
|
|
|
|
break;
|
|
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
|
|
case relationshipSet:
|
|
string relationshipPath = null;
|
|
try
|
|
{
|
|
relationshipPath =
|
|
InvokeProvider.Relationship.Resolve(
|
|
Relationship,
|
|
Path,
|
|
Property,
|
|
Target);
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
result = SessionState.Path.SetLocation (relationshipPath, CmdletProviderContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
return;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
return;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
return;
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
return;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
return;
|
|
}
|
|
|
|
break;
|
|
#endif
|
|
default:
|
|
Dbg.Diagnostics.Assert(
|
|
false,
|
|
"One of the specified parameter sets should have been called");
|
|
break;
|
|
}
|
|
|
|
if (passThrough && result != null)
|
|
{
|
|
WriteObject(result);
|
|
}
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
|
|
} // SetLocationCommand
|
|
|
|
#endregion SetLocationCommand
|
|
|
|
#region PushLocationCommand
|
|
|
|
/// <summary>
|
|
/// The core command for setting/changing location and pushing it onto a location stack.
|
|
/// This is the equivalent of the pushd command.
|
|
/// </summary>
|
|
[Cmdlet(VerbsCommon.Push, "Location", DefaultParameterSetName = "Path", SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113370")]
|
|
public class PushLocationCommand : CoreCommandBase
|
|
{
|
|
#region Command parameters
|
|
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
private const string relationshipSet = "Relationship";
|
|
#endif
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path property
|
|
/// </summary>
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
[Parameter (Position = 0, ParameterSetName = relationshipSet, ValueFromPipelineByPropertyName = true)]
|
|
#endif
|
|
[Parameter(Position=0, ParameterSetName = "Path",
|
|
ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)]
|
|
public string Path
|
|
{
|
|
get
|
|
{
|
|
return path;
|
|
}
|
|
set
|
|
{
|
|
path = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path parameter to the command
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "LiteralPath",
|
|
ValueFromPipeline=false, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return path;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
path = value;
|
|
} // set
|
|
} // LiteralPath
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the parameter -passThru which states output from
|
|
/// the command should be placed in the pipeline.
|
|
/// </summary>
|
|
[Parameter]
|
|
public SwitchParameter PassThru
|
|
{
|
|
get
|
|
{
|
|
return passThrough;
|
|
} // get
|
|
set
|
|
{
|
|
passThrough = value;
|
|
} //set
|
|
} // PassThru
|
|
|
|
/// <summary>
|
|
/// Gets or sets the StackName parameter which determines which location stack
|
|
/// to use for the push. If the parameter is missing or empty the default
|
|
/// location stack is used.
|
|
/// </summary>
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
[Parameter (ParameterSetName = relationshipSet)]
|
|
#endif
|
|
[Parameter (ValueFromPipelineByPropertyName = true)]
|
|
public string StackName
|
|
{
|
|
get
|
|
{
|
|
return stackName;
|
|
} // get
|
|
set
|
|
{
|
|
stackName = value;
|
|
} //set
|
|
} // StackName
|
|
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
|
|
/// <summary>
|
|
/// Gets or sets the relationship Parameter which determines which relationship
|
|
/// to resolve to a path to set-location to.
|
|
/// </summary>
|
|
///
|
|
[Parameter (Mandatory = true, ParameterSetName = relationshipSet, ValueFromPipelineByPropertyName = true)]
|
|
public string Relationship
|
|
{
|
|
get
|
|
{
|
|
return relationship;
|
|
}
|
|
|
|
set
|
|
{
|
|
relationship = value;
|
|
}
|
|
}
|
|
private string relationship = String.Empty;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Property parameter value
|
|
/// </summary>
|
|
///
|
|
[Parameter (ParameterSetName = relationshipSet, ValueFromPipelineByPropertyName = true)]
|
|
public string Property
|
|
{
|
|
get
|
|
{
|
|
return property;
|
|
}
|
|
|
|
set
|
|
{
|
|
property = value;
|
|
}
|
|
}
|
|
private string property = String.Empty;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Target parameter value
|
|
/// </summary>
|
|
///
|
|
[Parameter (ParameterSetName = relationshipSet, ValueFromPipelineByPropertyName = true)]
|
|
public string Target
|
|
{
|
|
get
|
|
{
|
|
return target;
|
|
}
|
|
|
|
set
|
|
{
|
|
target = value;
|
|
}
|
|
}
|
|
private string target = String.Empty;
|
|
#endif
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
|
|
/// <summary>
|
|
/// The filter used when doing a dir
|
|
/// </summary>
|
|
private string path = String.Empty;
|
|
|
|
/// <summary>
|
|
/// Determines if output should be passed through for
|
|
/// push-location.
|
|
/// </summary>
|
|
private bool passThrough;
|
|
|
|
/// <summary>
|
|
/// The ID of the stack to use for the pop.
|
|
/// </summary>
|
|
private string stackName;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// The functional part of the code that does the changing of the current
|
|
/// working directory and pushes the container onto the stack.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
// Push the current working directory onto the
|
|
// working directory stack
|
|
SessionState.Path.PushCurrentLocation (stackName);
|
|
|
|
#if RELATIONSHIP_SUPPORTED
|
|
// 2004/11/24-JeffJon - Relationships have been removed from the Exchange release
|
|
|
|
if (String.Equals(
|
|
relationshipSet,
|
|
ParameterSetName,
|
|
StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
try
|
|
{
|
|
Path =
|
|
InvokeProvider.Relationship.Resolve(
|
|
Relationship,
|
|
Path,
|
|
Property,
|
|
Target);
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
|
|
return;
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
return;
|
|
}
|
|
}
|
|
#endif
|
|
if (Path != null)
|
|
{
|
|
try
|
|
{
|
|
// Now change the directory to the one specified
|
|
// in the command
|
|
PathInfo result = SessionState.Path.SetLocation(Path, CmdletProviderContext);
|
|
|
|
if (PassThru)
|
|
{
|
|
WriteObject(result);
|
|
}
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
return;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
return;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
return;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
return;
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
return;
|
|
}
|
|
} // Path != null
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
|
|
} // PushLocationCommand
|
|
|
|
#endregion PushLocationCommand
|
|
|
|
#region PopLocationCommand
|
|
|
|
/// <summary>
|
|
/// The core command for pop-location. This is the equivalent of the popd command.
|
|
/// It pops a container from the stack and sets the current location to that container.
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.Pop, "Location", SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113369")]
|
|
public class PopLocationCommand : CoreCommandBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the parameter -passThru which states output from
|
|
/// the command should be placed in the pipeline.
|
|
/// </summary>
|
|
[Parameter]
|
|
public SwitchParameter PassThru
|
|
{
|
|
get
|
|
{
|
|
return passThrough;
|
|
} // get
|
|
set
|
|
{
|
|
passThrough = value;
|
|
} //set
|
|
} // PassThru
|
|
|
|
/// <summary>
|
|
/// Gets or sets the StackName parameter which determines which location stack
|
|
/// to use for the pop. If the parameter is missing or empty the default
|
|
/// location stack is used.
|
|
/// </summary>
|
|
[Parameter (ValueFromPipelineByPropertyName = true)]
|
|
public string StackName
|
|
{
|
|
get
|
|
{
|
|
return stackName;
|
|
} // get
|
|
set
|
|
{
|
|
stackName = value;
|
|
} //set
|
|
} // StackName
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
|
|
/// <summary>
|
|
/// Determines if output should be passed through for
|
|
/// pop-location.
|
|
/// </summary>
|
|
private bool passThrough;
|
|
|
|
/// <summary>
|
|
/// The ID of the stack to use for the pop.
|
|
/// </summary>
|
|
private string stackName;
|
|
|
|
#endregion Command data
|
|
|
|
|
|
#region Command code
|
|
|
|
|
|
/// <summary>
|
|
/// Gets the top container from the location stack and sets the
|
|
/// location to it.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
try
|
|
{
|
|
// Pop the top of the location stack.
|
|
|
|
PathInfo result = SessionState.Path.PopLocation(stackName);
|
|
|
|
if (PassThru)
|
|
{
|
|
WriteObject(result);
|
|
}
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
return;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
return;
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
return;
|
|
}
|
|
catch (ItemNotFoundException itemNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
itemNotFound.ErrorRecord,
|
|
itemNotFound));
|
|
return;
|
|
}
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
} // PopLocationCommand
|
|
|
|
#endregion PopLocationCommand
|
|
|
|
#region Drive commands
|
|
|
|
#region NewPSDriveCommand
|
|
|
|
/// <summary>
|
|
/// Mounts a drive in the Monad namespace.
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.New, "PSDrive", SupportsShouldProcess = true, SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113357")]
|
|
public class NewPSDriveCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the name of the drive
|
|
/// </summary>
|
|
///
|
|
[Parameter(Position = 0, Mandatory = true, ValueFromPipelineByPropertyName = true)]
|
|
public string Name
|
|
{
|
|
get
|
|
{
|
|
return name;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
throw PSTraceSource.NewArgumentNullException("value");
|
|
}
|
|
|
|
name = value;
|
|
}
|
|
} // public string Name
|
|
|
|
/// <summary>
|
|
/// Gets or sets the provider ID
|
|
/// </summary>
|
|
///
|
|
[Parameter(Position = 1, Mandatory = true, ValueFromPipelineByPropertyName = true)]
|
|
public string PSProvider
|
|
{
|
|
get
|
|
{
|
|
return provider;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
throw PSTraceSource.NewArgumentNullException("value");
|
|
}
|
|
|
|
provider = value;
|
|
}
|
|
} // public string Provider
|
|
|
|
/// <summary>
|
|
/// Gets or sets the root of the drive. This path should be
|
|
/// a namespace specific path.
|
|
/// </summary>
|
|
///
|
|
[Parameter(Position = 2, Mandatory = true, ValueFromPipelineByPropertyName = true)]
|
|
[AllowEmptyString]
|
|
public string Root
|
|
{
|
|
get
|
|
{
|
|
return root;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
throw PSTraceSource.NewArgumentNullException("value");
|
|
}
|
|
|
|
root = value;
|
|
}
|
|
} // public string Root
|
|
|
|
/// <summary>
|
|
/// Gets or sets the description of the drive
|
|
/// </summary>
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
public string Description
|
|
{
|
|
get
|
|
{
|
|
return description;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
throw PSTraceSource.NewArgumentNullException("value");
|
|
}
|
|
|
|
description = value;
|
|
}
|
|
} // public string Description
|
|
|
|
/// <summary>
|
|
/// Gets or sets the scope identifier for the drive being created.
|
|
/// </summary>
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
public string Scope
|
|
{
|
|
get
|
|
{
|
|
return scope;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
scope = value;
|
|
} // set
|
|
} // Scope
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Persist Switch parameter.
|
|
/// If this switch parmter is set then the created PSDrive
|
|
/// would be persisted across PowerShell sessions.
|
|
/// </summary>
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
public SwitchParameter Persist
|
|
{
|
|
get { return persist; }
|
|
set { persist = value; }
|
|
}
|
|
private bool persist = false;
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the new-psdrive cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
return SessionState.Drive.NewDriveDynamicParameters(PSProvider, context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// new-psdrive always supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
|
|
/// <summary>
|
|
/// The name of the drive
|
|
/// </summary>
|
|
private string name;
|
|
|
|
/// <summary>
|
|
/// The provider ID for the drive
|
|
/// </summary>
|
|
private string provider;
|
|
|
|
/// <summary>
|
|
/// The namespace specific path of the root of the drive
|
|
/// </summary>
|
|
private string root;
|
|
|
|
/// <summary>
|
|
/// A description for the drive
|
|
/// </summary>
|
|
private string description;
|
|
|
|
/// <summary>
|
|
/// The scope identifier for the scope to create the drive in.
|
|
/// If null or empty the drive will be created in the current scope.
|
|
/// </summary>
|
|
private string scope;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Adds a new drive to the Monad namespace
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
ProviderInfo provider = null;
|
|
|
|
try
|
|
{
|
|
provider = SessionState.Internal.GetSingleProvider(PSProvider);
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
return;
|
|
}
|
|
|
|
// Check to see if the provider exists
|
|
if (provider != null)
|
|
{
|
|
// Get the confirmation strings
|
|
|
|
string action = NavigationResources.NewDriveConfirmAction;
|
|
string resourceTemplate = NavigationResources.NewDriveConfirmResourceTemplate;
|
|
|
|
string resource =
|
|
String.Format(
|
|
System.Globalization.CultureInfo.CurrentCulture,
|
|
resourceTemplate,
|
|
Name,
|
|
provider.FullName,
|
|
Root);
|
|
|
|
if (ShouldProcess(resource, action))
|
|
{
|
|
// -Persist switch parameter is supported only for FileSystem provider.
|
|
if (Persist && !provider.Name.Equals(FileSystemProvider.ProviderName, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
ErrorRecord er = new ErrorRecord(new NotSupportedException(FileSystemProviderStrings.PersistNotSupported), "DriveRootNotNetworkPath", ErrorCategory.InvalidArgument, this);
|
|
ThrowTerminatingError(er);
|
|
}
|
|
|
|
// Create the new drive
|
|
PSDriveInfo newDrive =
|
|
new PSDriveInfo(
|
|
Name,
|
|
provider,
|
|
Root,
|
|
Description,
|
|
Credential,
|
|
Persist);
|
|
|
|
try
|
|
{
|
|
SessionState.Drive.New(newDrive, Scope, CmdletProviderContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
return;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
return;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
return;
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
return;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
return;
|
|
}
|
|
catch (SessionStateOverflowException)
|
|
{
|
|
// This is terminating condition
|
|
throw;
|
|
}
|
|
catch (SessionStateException sessionStateException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
sessionStateException.ErrorRecord,
|
|
sessionStateException));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
} // ProcessRecord
|
|
#endregion Command code
|
|
|
|
}
|
|
|
|
#endregion NewPSDriveCommand
|
|
|
|
#region DriveMatchingCoreCommandBase
|
|
|
|
/// <summary>
|
|
/// Base class for Drive commands that need to glob drives on both the drive name
|
|
/// and the provider name.
|
|
/// </summary>
|
|
public class DriveMatchingCoreCommandBase : CoreCommandBase
|
|
{
|
|
/// <summary>
|
|
/// Globs on both the drive name and the provider name to get a list of Drives
|
|
/// that match the glob filters.
|
|
/// </summary>
|
|
///
|
|
/// <param name="driveName">
|
|
/// The name of the drive(s) to returned. The name can contain glob characters.
|
|
/// </param>
|
|
///
|
|
/// <param name="providerNames">
|
|
/// The name of the provider(s) to return. The name can contain glob characters.
|
|
/// </param>
|
|
///
|
|
/// <param name="scope">
|
|
/// The scope to get the drives from. If this parameter is null or empty all drives
|
|
/// will be retrieved.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// A collection of the drives that match the filters.
|
|
/// </returns>
|
|
///
|
|
/// <exception cref="DriveNotFoundException"></exception>
|
|
/// <exception cref="ProviderNotFoundException"></exception>
|
|
///
|
|
/// <exception cref="ArgumentException">
|
|
/// If <paramref name="scope"/> is less than zero, or not
|
|
/// a number and not "script", "global", "local", or "private"
|
|
/// </exception>
|
|
///
|
|
/// <exception cref="ArgumentOutOfRangeException">
|
|
/// If <paramref name="scope"/> is less than zero or greater than the number of currently
|
|
/// active scopes.
|
|
/// </exception>
|
|
///
|
|
internal List<PSDriveInfo> GetMatchingDrives(
|
|
string driveName,
|
|
string[] providerNames,
|
|
string scope)
|
|
{
|
|
List<PSDriveInfo> results = new List<PSDriveInfo>();
|
|
|
|
if (providerNames == null || providerNames.Length == 0)
|
|
{
|
|
providerNames = new string[] { "*" };
|
|
}
|
|
|
|
foreach (string providerName in providerNames)
|
|
{
|
|
tracer.WriteLine("ProviderName: {0}", providerName);
|
|
|
|
bool providerNameEmpty = String.IsNullOrEmpty(providerName);
|
|
bool providerNameContainsWildcardCharacters =
|
|
WildcardPattern.ContainsWildcardCharacters(providerName);
|
|
|
|
bool driveNameEmpty = String.IsNullOrEmpty(driveName);
|
|
bool driveNameContainsWildcardCharacters =
|
|
WildcardPattern.ContainsWildcardCharacters(driveName);
|
|
|
|
// This is just a simple check to see if the provider exists
|
|
// if the provider name is specified without glob characters.
|
|
// The call will throw an exception if the provider doesn't
|
|
// exist.
|
|
if (!providerNameEmpty && !providerNameContainsWildcardCharacters)
|
|
{
|
|
SessionState.Provider.Get(providerName);
|
|
}
|
|
|
|
// This is just a simple check to see if the drive exists
|
|
// if the drive name is specified without glob characters.
|
|
// The call will throw an exception if the drive doesn't
|
|
// exist.
|
|
if (!driveNameEmpty && !driveNameContainsWildcardCharacters)
|
|
{
|
|
if (String.IsNullOrEmpty(scope))
|
|
{
|
|
SessionState.Drive.Get(driveName);
|
|
}
|
|
else
|
|
{
|
|
SessionState.Drive.GetAtScope(driveName, scope);
|
|
}
|
|
}
|
|
|
|
|
|
WildcardPattern providerMatcher = null;
|
|
PSSnapinQualifiedName pssnapinQualifiedProviderName = null;
|
|
|
|
if (!providerNameEmpty)
|
|
{
|
|
pssnapinQualifiedProviderName = PSSnapinQualifiedName.GetInstance(providerName);
|
|
|
|
if (pssnapinQualifiedProviderName == null)
|
|
{
|
|
// This is a malformed pssnapin-qualified name so there is no chances for a match.
|
|
continue;
|
|
}
|
|
|
|
providerMatcher =
|
|
WildcardPattern.Get(
|
|
pssnapinQualifiedProviderName.ShortName,
|
|
WildcardOptions.IgnoreCase);
|
|
}
|
|
|
|
|
|
WildcardPattern nameMatcher = null;
|
|
|
|
if (!driveNameEmpty)
|
|
{
|
|
nameMatcher =
|
|
WildcardPattern.Get(
|
|
driveName,
|
|
WildcardOptions.IgnoreCase);
|
|
}
|
|
|
|
foreach (PSDriveInfo drive in SessionState.Drive.GetAllAtScope(scope))
|
|
{
|
|
bool addDrive = driveNameEmpty;
|
|
|
|
if(base.SuppressWildcardExpansion)
|
|
{
|
|
if(String.Equals(drive.Name, driveName, StringComparison.OrdinalIgnoreCase))
|
|
addDrive = true;
|
|
}
|
|
else
|
|
{
|
|
if(nameMatcher.IsMatch(drive.Name))
|
|
addDrive = true;
|
|
}
|
|
|
|
if (addDrive)
|
|
{
|
|
// Now check to see if it matches the provider
|
|
if (providerNameEmpty || drive.Provider.IsMatch(providerMatcher, pssnapinQualifiedProviderName))
|
|
{
|
|
results.Add(drive);
|
|
}
|
|
} // nameMatcher.IsMatch()
|
|
} // foreach Drive
|
|
}
|
|
results.Sort();
|
|
return results;
|
|
}
|
|
} // DriveMatchingCoreCommandBase
|
|
|
|
#endregion DriveMatchingCoreCommandBase
|
|
|
|
#region RemovePSDriveCommand
|
|
|
|
/// <summary>
|
|
/// Removes a drive that is mounted in the Monad namespace.
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.Remove, "PSDrive", DefaultParameterSetName = "Name", SupportsShouldProcess = true, SupportsTransactions = true,
|
|
HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113376")]
|
|
public class RemovePSDriveCommand : DriveMatchingCoreCommandBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the name of the drive to remove.
|
|
/// </summary>
|
|
[Parameter(Position=0, ParameterSetName = "Name",
|
|
Mandatory = true, ValueFromPipelineByPropertyName = true)]
|
|
[AllowNull]
|
|
[AllowEmptyCollection]
|
|
public string[] Name
|
|
{
|
|
get
|
|
{
|
|
return names;
|
|
}
|
|
set
|
|
{
|
|
names = value;
|
|
}
|
|
} // Name
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal name parameter to the command
|
|
/// </summary>
|
|
[Parameter(Position = 0, ParameterSetName = "LiteralName",
|
|
Mandatory = true, ValueFromPipeline = false, ValueFromPipelineByPropertyName = true)]
|
|
public string[] LiteralName
|
|
{
|
|
get
|
|
{
|
|
return names;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
names = value;
|
|
} // set
|
|
} // LiteralName
|
|
|
|
/// <summary>
|
|
/// Gets or sets the name provider(s) for which the drives should be removed.
|
|
/// </summary>
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
public string[] PSProvider
|
|
{
|
|
get
|
|
{
|
|
return provider;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
value = new string[0];
|
|
}
|
|
provider = value;
|
|
}
|
|
} // Provider
|
|
|
|
/// <summary>
|
|
/// Gets or sets the scope identifier from which to remove the drive.
|
|
/// If the scope is null or empty, the scope hierarchy will be searched
|
|
/// starting at the current scope through all the parent scopes to the
|
|
/// global scope until a drive of the given name is found to remove.
|
|
/// </summary>
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
public string Scope
|
|
{
|
|
get
|
|
{
|
|
return scope;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
scope = value;
|
|
} // set
|
|
} // Scope
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property which determines if the drive
|
|
/// should be removed even if there were errors.
|
|
/// </summary>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Force = value;
|
|
} // set
|
|
} // Force
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
|
|
/// <summary>
|
|
/// The name of the drive to remove.
|
|
/// </summary>
|
|
private string[] names;
|
|
|
|
/// <summary>
|
|
/// The name of the provider(s) for which to remove all drives.
|
|
/// </summary>
|
|
private string[] provider = new string[0];
|
|
|
|
/// <summary>
|
|
/// The scope identifier for the scope to remove the drive from.
|
|
/// If null or empty the scope hierarchy will be searched starting
|
|
/// from the current scope through the parents to the global scope
|
|
/// until a drive of the specified name is found and removed.
|
|
/// </summary>
|
|
private string scope;
|
|
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Removes the specified drive from the Monad namespace using the name
|
|
/// of the drive.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
// Get the confirmation strings
|
|
|
|
string action = NavigationResources.RemoveDriveConfirmAction;
|
|
string resourceTemplate = NavigationResources.RemoveDriveConfirmResourceTemplate;
|
|
|
|
bool verifyMatch = true;
|
|
if (names == null)
|
|
{
|
|
names = new string[] { string.Empty };
|
|
verifyMatch = false;
|
|
}
|
|
|
|
foreach (string driveName in names)
|
|
{
|
|
bool foundMatch = false;
|
|
try
|
|
{
|
|
foreach (PSDriveInfo drive in GetMatchingDrives(driveName, PSProvider, Scope))
|
|
{
|
|
string resource =
|
|
String.Format(
|
|
System.Globalization.CultureInfo.CurrentCulture,
|
|
resourceTemplate,
|
|
drive.Name,
|
|
drive.Provider,
|
|
drive.Root);
|
|
|
|
foundMatch = true;
|
|
if (ShouldProcess(resource, action))
|
|
{
|
|
if (!Force && drive == SessionState.Drive.Current)
|
|
{
|
|
PSInvalidOperationException invalidOperation =
|
|
(PSInvalidOperationException)
|
|
PSTraceSource.NewInvalidOperationException(
|
|
NavigationResources.RemoveDriveInUse,
|
|
drive.Name);
|
|
|
|
WriteError(
|
|
new ErrorRecord(
|
|
invalidOperation.ErrorRecord,
|
|
invalidOperation));
|
|
continue;
|
|
}
|
|
SessionState.Drive.Remove(drive.Name, Force, Scope, CmdletProviderContext);
|
|
}
|
|
}
|
|
|
|
}
|
|
catch (DriveNotFoundException)
|
|
{
|
|
}
|
|
catch (ProviderNotFoundException)
|
|
{
|
|
}
|
|
|
|
// If a name was specified explicitly write an error if the drive wasn't
|
|
// found
|
|
|
|
if (verifyMatch && !foundMatch)
|
|
{
|
|
DriveNotFoundException e = new DriveNotFoundException (
|
|
driveName,
|
|
"DriveNotFound",
|
|
SessionStateStrings.DriveNotFound);
|
|
WriteError (new ErrorRecord (e.ErrorRecord, e));
|
|
}
|
|
}
|
|
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
|
|
} // RemovePSDriveCommand
|
|
|
|
#endregion RemovePSDriveCommand
|
|
|
|
#region GetPSDriveCommand
|
|
|
|
/// <summary>
|
|
/// Gets a specified or listing of drives that are mounted in the Monad
|
|
/// namespace.
|
|
/// </summary>
|
|
[Cmdlet(VerbsCommon.Get, "PSDrive", DefaultParameterSetName = "Name", SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113327")]
|
|
[OutputType(typeof(PSDriveInfo))]
|
|
public class GetPSDriveCommand : DriveMatchingCoreCommandBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the drive name the user is looking for.
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// If the drive name is left empty, all drives will be
|
|
/// returned. A globing or regular expression can also be
|
|
/// supplied and any drive names that match the expression
|
|
/// will be returned.
|
|
/// </remarks>
|
|
[Parameter(Position=0, ParameterSetName = "Name", ValueFromPipelineByPropertyName = true)]
|
|
[ValidateNotNullOrEmpty]
|
|
public string[] Name
|
|
{
|
|
get
|
|
{
|
|
return name;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
value = new string[] { "*" };
|
|
}
|
|
name = value;
|
|
}
|
|
} // Name
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal name parameter to the command
|
|
/// </summary>
|
|
[Parameter(Position=0, ParameterSetName = "LiteralName",
|
|
Mandatory = true, ValueFromPipeline = false, ValueFromPipelineByPropertyName = true)]
|
|
public string[] LiteralName
|
|
{
|
|
get
|
|
{
|
|
return name;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
name = value;
|
|
} // set
|
|
} // LiteralName
|
|
|
|
/// <summary>
|
|
/// Gets or sets the scope parameter to the command.
|
|
/// </summary>
|
|
///
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
public string Scope
|
|
{
|
|
get
|
|
{
|
|
return scope;
|
|
} //get
|
|
|
|
set
|
|
{
|
|
scope = value;
|
|
}
|
|
} // Scope
|
|
|
|
/// <summary>
|
|
/// Gets or sets the provider name for the
|
|
/// drives that should be retrieved.
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// If the provider is left empty, all drives will be
|
|
/// returned. A globing or regular expression can also be
|
|
/// supplied and any drive with providers that match the expression
|
|
/// will be returned.
|
|
/// </remarks>
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
public string[] PSProvider
|
|
{
|
|
get
|
|
{
|
|
return provider;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
value = new string[0];
|
|
}
|
|
provider = value;
|
|
}
|
|
} // Provider
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
|
|
/// <summary>
|
|
/// The name of the drive to be retrieved.
|
|
/// </summary>
|
|
private string[] name = new string[] { "*" };
|
|
|
|
/// <summary>
|
|
/// The provider ID for the drives you want to see.
|
|
/// </summary>
|
|
private string[] provider = new string[0];
|
|
|
|
/// <summary>
|
|
/// The scope to get the drive(s) from.
|
|
/// </summary>
|
|
private string scope;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Prepare the session for the Get-PSDrive command.
|
|
/// Currently, auto-loads the core modules that define drives. Ideally,
|
|
/// we could discover fake PSDriveInfo objects here based on drives exported
|
|
/// from modules.
|
|
/// </summary>
|
|
protected override void BeginProcessing()
|
|
{
|
|
SessionStateInternal.MountDefaultDrive("Cert", Context);
|
|
SessionStateInternal.MountDefaultDrive("WSMan", Context);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Retrieves the drives specified by the parameters. If the name is empty, all drives
|
|
/// will be retrieved. If the provider is specified, only drives for that provider
|
|
/// will be retrieved.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
foreach (string driveName in Name)
|
|
{
|
|
try
|
|
{
|
|
List<PSDriveInfo> foundDrives = GetMatchingDrives(driveName, PSProvider, Scope);
|
|
|
|
if (foundDrives.Count > 0)
|
|
{
|
|
WriteObject(foundDrives, true);
|
|
}
|
|
else
|
|
{
|
|
// If no drives were found and the user was asking for a specific
|
|
// drive (no wildcards) then write an error
|
|
|
|
if (!WildcardPattern.ContainsWildcardCharacters(driveName))
|
|
{
|
|
DriveNotFoundException driveNotFound =
|
|
new DriveNotFoundException(
|
|
driveName,
|
|
"DriveNotFound",
|
|
SessionStateStrings.DriveNotFound);
|
|
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound,
|
|
"GetDriveNoMatchingDrive",
|
|
ErrorCategory.ObjectNotFound,
|
|
driveName));
|
|
}
|
|
}
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
ErrorRecord errorRecord =
|
|
new ErrorRecord(
|
|
driveNotFound,
|
|
"GetLocationNoMatchingDrive",
|
|
ErrorCategory.ObjectNotFound,
|
|
driveName);
|
|
WriteError(errorRecord);
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
ErrorRecord errorRecord =
|
|
new ErrorRecord(
|
|
providerNotFound,
|
|
"GetLocationNoMatchingDrive",
|
|
ErrorCategory.ObjectNotFound,
|
|
PSProvider);
|
|
WriteError(errorRecord);
|
|
}
|
|
catch (PSArgumentOutOfRangeException outOfRange)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
outOfRange.ErrorRecord,
|
|
outOfRange));
|
|
}
|
|
catch (PSArgumentException argException)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
argException.ErrorRecord,
|
|
argException));
|
|
}
|
|
}
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
|
|
} // GetPSDriveCommand
|
|
|
|
#endregion GetPSDriveCommand
|
|
|
|
#endregion Drive commands
|
|
|
|
#region Item commands
|
|
|
|
#region GetItemCommand
|
|
|
|
/// <summary>
|
|
/// Gets the specified item using the namespace providers.
|
|
/// </summary>
|
|
[Cmdlet(VerbsCommon.Get, "Item", DefaultParameterSetName = "Path", SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113319")]
|
|
public class GetItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path to item to get.
|
|
/// </summary>
|
|
[Parameter(Position = 0, ParameterSetName = "Path",
|
|
Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
|
|
public string[] Path
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
}
|
|
set
|
|
{
|
|
paths = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path parameter to the command
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "LiteralPath",
|
|
Mandatory = true, ValueFromPipeline = false, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string[] LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
paths = value;
|
|
} // set
|
|
} // LiteralPath
|
|
|
|
/// <summary>
|
|
/// Gets or sets the filter property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string Filter
|
|
{
|
|
get
|
|
{
|
|
return base.Filter;
|
|
}
|
|
set
|
|
{
|
|
base.Filter = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the include property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Include
|
|
{
|
|
get
|
|
{
|
|
return base.Include;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Include = value;
|
|
} // set
|
|
} // Include
|
|
|
|
/// <summary>
|
|
/// Gets or sets the exclude property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Exclude
|
|
{
|
|
get
|
|
{
|
|
return base.Exclude;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Exclude = value;
|
|
} // set
|
|
} // Exclude
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
/// </remarks>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
}
|
|
set
|
|
{
|
|
base.Force = value;
|
|
}
|
|
} // Force
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the get-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
if (Path != null && Path.Length > 0)
|
|
{
|
|
return InvokeProvider.Item.GetItemDynamicParameters(Path[0], context);
|
|
}
|
|
return InvokeProvider.Item.GetItemDynamicParameters(".", context);
|
|
} // GetDynamicParameters
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The path of the item to get.
|
|
/// </summary>
|
|
private string[] paths;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Gets the specified item.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
foreach (string path in paths)
|
|
{
|
|
try
|
|
{
|
|
InvokeProvider.Item.Get(path, CmdletProviderContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
}
|
|
|
|
}
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
|
|
} // GetItemCommand
|
|
|
|
#endregion GetItemCommand
|
|
|
|
#region NewItemCommand
|
|
|
|
/// <summary>
|
|
/// Creates the specified item using the namespace providers.
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.New, "Item", DefaultParameterSetName = "pathSet", SupportsShouldProcess = true, SupportsTransactions = true,
|
|
HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113353")]
|
|
public class NewItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
|
|
private const string nameSet = "nameSet";
|
|
private const string pathSet = "pathSet";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the container path to create the item in.
|
|
/// </summary>
|
|
[Parameter(Position=0,ParameterSetName="pathSet", Mandatory = true,ValueFromPipelineByPropertyName = true)]
|
|
[Parameter(Position=0,ParameterSetName="nameSet", Mandatory = false,ValueFromPipelineByPropertyName = true)]
|
|
public string[] Path
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
}
|
|
set
|
|
{
|
|
paths = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the name of the item to create
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "nameSet", Mandatory = true, ValueFromPipelineByPropertyName = true)]
|
|
[AllowNull]
|
|
[AllowEmptyString]
|
|
public string Name
|
|
{
|
|
get
|
|
{
|
|
return name;
|
|
}
|
|
set
|
|
{
|
|
name = value;
|
|
}
|
|
} // Name
|
|
|
|
/// <summary>
|
|
/// Gets or sets the type of the item to create
|
|
/// </summary>
|
|
[Parameter(ValueFromPipelineByPropertyName = true)]
|
|
[Alias("Type")]
|
|
public string ItemType
|
|
{
|
|
get
|
|
{
|
|
return type;
|
|
}
|
|
set
|
|
{
|
|
type = value;
|
|
}
|
|
} // Type
|
|
|
|
/// <summary>
|
|
/// Gets or sets the content of the item to create
|
|
/// </summary>
|
|
[Parameter(ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("Target")]
|
|
public object Value
|
|
|
|
{
|
|
get
|
|
{
|
|
return content;
|
|
}
|
|
set
|
|
{
|
|
content = value;
|
|
}
|
|
} // Content
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
/// </remarks>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
}
|
|
set
|
|
{
|
|
base.Force = value;
|
|
}
|
|
} // Force
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the new-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
if (Path != null && Path.Length > 0)
|
|
{
|
|
// Path is only globbed if Name is specified.
|
|
if(String.IsNullOrEmpty(Name))
|
|
return InvokeProvider.Item.NewItemDynamicParameters(WildcardPattern.Escape(Path[0]), ItemType, Value, context);
|
|
else
|
|
return InvokeProvider.Item.NewItemDynamicParameters(Path[0], ItemType, Value, context);
|
|
}
|
|
return InvokeProvider.Item.NewItemDynamicParameters(".", ItemType, Value, context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return base.DoesProviderSupportShouldProcess (paths);
|
|
}
|
|
}
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The path of the container to create the item in. It may
|
|
/// contain glob characters.
|
|
/// </summary>
|
|
private string[] paths;
|
|
|
|
/// <summary>
|
|
/// The name of the item to create. It may not contain glob characters.
|
|
/// </summary>
|
|
private string name;
|
|
|
|
/// <summary>
|
|
/// The type of the item to create.
|
|
/// </summary>
|
|
private string type;
|
|
|
|
/// <summary>
|
|
/// The content to create the new item with.
|
|
/// </summary>
|
|
private object content;
|
|
|
|
#endregion Command Data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Creates the specified item.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
if (paths == null ||
|
|
(paths != null && paths.Length == 0))
|
|
{
|
|
paths = new string[] { String.Empty };
|
|
}
|
|
|
|
foreach (string path in paths)
|
|
{
|
|
try
|
|
{
|
|
InvokeProvider.Item.New(path, Name, ItemType, Value, CmdletProviderContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
}
|
|
|
|
}
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
|
|
} // NewItemCommand
|
|
|
|
#endregion NewItemCommand
|
|
|
|
#region SetItemCommand
|
|
|
|
/// <summary>
|
|
/// Sets the specified item using the namespace providers.
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.Set, "Item", SupportsShouldProcess = true, DefaultParameterSetName = "Path", SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113395")]
|
|
public class SetItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path to item to set.
|
|
/// </summary>
|
|
[Parameter(Position = 0, ParameterSetName = "Path",
|
|
Mandatory = true, ValueFromPipelineByPropertyName = true)]
|
|
public string[] Path
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
}
|
|
set
|
|
{
|
|
paths = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path parameter to the command
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "LiteralPath",
|
|
Mandatory = true, ValueFromPipeline = false, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string[] LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
paths = value;
|
|
} // set
|
|
} // LiteralPath
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the value of the item to be set
|
|
/// </summary>
|
|
[Parameter(Position = 1, ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)]
|
|
public object Value
|
|
{
|
|
get
|
|
{
|
|
return newValue;
|
|
}
|
|
set
|
|
{
|
|
newValue = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
/// </remarks>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
}
|
|
set
|
|
{
|
|
base.Force = value;
|
|
}
|
|
} // Force
|
|
|
|
/// <summary>
|
|
/// Gets or sets the pass through property which determines
|
|
/// if the object that is set should be written to the pipeline.
|
|
/// Defaults to false.
|
|
/// </summary>
|
|
///
|
|
[Parameter]
|
|
public SwitchParameter PassThru
|
|
{
|
|
get
|
|
{
|
|
return passThrough;
|
|
}
|
|
|
|
set
|
|
{
|
|
passThrough = value;
|
|
}
|
|
} // PassThru
|
|
|
|
/// <summary>
|
|
/// Gets or sets the filter property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string Filter
|
|
{
|
|
get
|
|
{
|
|
return base.Filter;
|
|
}
|
|
set
|
|
{
|
|
base.Filter = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the include property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Include
|
|
{
|
|
get
|
|
{
|
|
return base.Include;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Include = value;
|
|
} // set
|
|
} // Include
|
|
|
|
/// <summary>
|
|
/// Gets or sets the exclude property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Exclude
|
|
{
|
|
get
|
|
{
|
|
return base.Exclude;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Exclude = value;
|
|
} // set
|
|
} // Exclude
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the set-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
if (Path != null && Path.Length > 0)
|
|
{
|
|
return InvokeProvider.Item.SetItemDynamicParameters(Path[0], Value, context);
|
|
}
|
|
return InvokeProvider.Item.SetItemDynamicParameters(".", Value, context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return base.DoesProviderSupportShouldProcess (paths);
|
|
}
|
|
}
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The path of the item to set.
|
|
/// </summary>
|
|
private string[] paths;
|
|
|
|
/// <summary>
|
|
/// The value of the item to be set.
|
|
/// </summary>
|
|
private object newValue;
|
|
|
|
/// <summary>
|
|
/// Determines if the object being set should be written to the pipeline.
|
|
/// Defaults to false.
|
|
/// </summary>
|
|
private bool passThrough;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Sets the specified item.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
// Default to the CmdletProviderContext that will direct output to
|
|
// the pipeline.
|
|
|
|
CmdletProviderContext currentCommandContext = CmdletProviderContext;
|
|
currentCommandContext.PassThru = passThrough;
|
|
|
|
foreach (string path in paths)
|
|
{
|
|
try
|
|
{
|
|
InvokeProvider.Item.Set(path, Value, currentCommandContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
}
|
|
|
|
}
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
|
|
} // SetItemCommand
|
|
|
|
#endregion SetItemCommand
|
|
|
|
#region RemoveItemCommand
|
|
|
|
/// <summary>
|
|
/// Removes the specified item using the namespace providers.
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.Remove, "Item", SupportsShouldProcess = true, DefaultParameterSetName = "Path", SupportsTransactions = true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113373")]
|
|
public class RemoveItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path property
|
|
/// </summary>
|
|
[Parameter(Position = 0, ParameterSetName = "Path",
|
|
Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
|
|
public string[] Path
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
}
|
|
set
|
|
{
|
|
paths = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path parameter to the command
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "LiteralPath",
|
|
Mandatory = true, ValueFromPipeline = false, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string[] LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
paths = value;
|
|
} // set
|
|
} // LiteralPath
|
|
|
|
/// <summary>
|
|
/// Gets or sets the filter property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string Filter
|
|
{
|
|
get
|
|
{
|
|
return base.Filter;
|
|
}
|
|
set
|
|
{
|
|
base.Filter = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the include property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Include
|
|
{
|
|
get
|
|
{
|
|
return base.Include;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Include = value;
|
|
} // set
|
|
} // Include
|
|
|
|
/// <summary>
|
|
/// Gets or sets the exclude property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Exclude
|
|
{
|
|
get
|
|
{
|
|
return base.Exclude;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Exclude = value;
|
|
} // set
|
|
} // Exclude
|
|
|
|
/// <summary>
|
|
/// Gets or sets the recurse property
|
|
/// </summary>
|
|
[Parameter]
|
|
public SwitchParameter Recurse
|
|
{
|
|
get
|
|
{
|
|
return recurse;
|
|
}
|
|
set
|
|
{
|
|
recurse = value;
|
|
}
|
|
} // Recurse
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
/// </remarks>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
}
|
|
set
|
|
{
|
|
base.Force = value;
|
|
}
|
|
} // Force
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the remove-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
if (Path != null && Path.Length > 0)
|
|
{
|
|
return InvokeProvider.Item.RemoveItemDynamicParameters(Path[0], Recurse, context);
|
|
}
|
|
return InvokeProvider.Item.RemoveItemDynamicParameters(".", Recurse, context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return base.DoesProviderSupportShouldProcess (paths);
|
|
}
|
|
}
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
|
|
/// <summary>
|
|
/// The path used when doing a delete
|
|
/// </summary>
|
|
private string[] paths;
|
|
|
|
/// <summary>
|
|
/// Determines if the remove command should recurse into
|
|
/// sub-containers.
|
|
/// </summary>
|
|
private bool recurse;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Removes the specified items.
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
CmdletProviderContext currentContext = CmdletProviderContext;
|
|
|
|
bool yesToAll = false;
|
|
bool noToAll = false;
|
|
|
|
foreach (string path in Path)
|
|
{
|
|
// Resolve the path in case it contains any glob characters
|
|
Collection<PathInfo> resolvedPSPaths = null;
|
|
|
|
try
|
|
{
|
|
// Save the include and exclude filters so that we can ignore
|
|
// them when doing recursion
|
|
Collection<string> include = currentContext.Include;
|
|
Collection<string> exclude = currentContext.Exclude;
|
|
string filter = currentContext.Filter;
|
|
|
|
if (recurse)
|
|
{
|
|
currentContext.SetFilters(
|
|
new Collection<string>(),
|
|
new Collection<string>(),
|
|
null);
|
|
}
|
|
try
|
|
{
|
|
resolvedPSPaths = SessionState.Path.GetResolvedPSPathFromPSPath(path, currentContext);
|
|
}
|
|
finally
|
|
{
|
|
// Reset the include and exclude filters
|
|
currentContext.SetFilters(
|
|
include,
|
|
exclude,
|
|
filter);
|
|
}
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
|
|
foreach (PathInfo resolvedPath in resolvedPSPaths)
|
|
{
|
|
// Check each path to make sure it isn't a parent of the current working location
|
|
|
|
bool isCurrentLocationOrAncestor = false;
|
|
|
|
try
|
|
{
|
|
|
|
isCurrentLocationOrAncestor = SessionState.Path.IsCurrentLocationOrAncestor (resolvedPath.Path, currentContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
|
|
if (isCurrentLocationOrAncestor)
|
|
{
|
|
PSInvalidOperationException invalidOperation =
|
|
(PSInvalidOperationException)
|
|
PSTraceSource.NewInvalidOperationException(
|
|
NavigationResources.RemoveItemInUse,
|
|
resolvedPath.Path);
|
|
|
|
WriteError (
|
|
new ErrorRecord (
|
|
invalidOperation.ErrorRecord,
|
|
invalidOperation));
|
|
continue;
|
|
}
|
|
|
|
bool hasChildren = false;
|
|
|
|
string providerPath = GetUnresolvedProviderPathFromPSPath(resolvedPath.Path);
|
|
|
|
try
|
|
{
|
|
hasChildren = SessionState.Internal.HasChildItems(resolvedPath.Provider.Name, providerPath, currentContext);
|
|
|
|
currentContext.ThrowFirstErrorOrDoNothing();
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
|
|
bool shouldRecurse = Recurse;
|
|
bool treatAsFile = false;
|
|
try
|
|
{
|
|
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(providerPath);
|
|
if (!Platform.IsWindows && di != null && (di.Attributes & System.IO.FileAttributes.ReparsePoint) != 0)
|
|
{
|
|
shouldRecurse = false;
|
|
treatAsFile = true;
|
|
}
|
|
}
|
|
catch (System.IO.FileNotFoundException)
|
|
{
|
|
// not a directory
|
|
}
|
|
|
|
if (!treatAsFile && !Recurse && hasChildren)
|
|
{
|
|
// Get the localized prompt string
|
|
|
|
string prompt = StringUtil.Format(NavigationResources.RemoveItemWithChildren,resolvedPath.Path);
|
|
|
|
// Confirm the user wants to remove all children and the item even if
|
|
// they did not specify -recurse
|
|
|
|
if (!ShouldContinue (prompt, null, ref yesToAll, ref noToAll))
|
|
{
|
|
continue;
|
|
}
|
|
shouldRecurse = true;
|
|
}
|
|
|
|
// Now do the delete
|
|
// This calls the internal method since it is more efficient
|
|
// than trying to glob again. It also will prevent problems
|
|
// where globbing a second time may not have properly escaped
|
|
// wildcard characters in the path.
|
|
|
|
try
|
|
{
|
|
SessionState.Internal.RemoveItem(
|
|
resolvedPath.Provider.Name,
|
|
providerPath,
|
|
shouldRecurse,
|
|
currentContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
} // ProcessRecord
|
|
|
|
#endregion Command code
|
|
|
|
} // RemoveItemCommand
|
|
|
|
#endregion RemoveItemCommand
|
|
|
|
#region MoveItemCommand
|
|
|
|
/// <summary>
|
|
/// Moves an item from the specified location to the specified destination using
|
|
/// the namespace providers.
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.Move, "Item", DefaultParameterSetName = "Path", SupportsShouldProcess = true, SupportsTransactions = true,
|
|
HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113350")]
|
|
public class MoveItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
/// <summary>
|
|
/// Gets or sets the path property
|
|
/// </summary>
|
|
[Parameter(Position = 0, ParameterSetName = "Path",
|
|
Mandatory = true, ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)]
|
|
public string[] Path
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
}
|
|
set
|
|
{
|
|
paths = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path parameter to the command
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "LiteralPath",
|
|
Mandatory = true, ValueFromPipeline=false, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string[] LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
paths = value;
|
|
} // set
|
|
} // LiteralPath
|
|
|
|
/// <summary>
|
|
/// Gets or sets the destination property
|
|
/// </summary>
|
|
[Parameter(Position = 1, ValueFromPipelineByPropertyName = true)]
|
|
public string Destination
|
|
{
|
|
get
|
|
{
|
|
return destination;
|
|
}
|
|
set
|
|
{
|
|
destination = value;
|
|
}
|
|
} // Destination
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
/// </remarks>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
}
|
|
set
|
|
{
|
|
base.Force = value;
|
|
}
|
|
} // Force
|
|
|
|
/// <summary>
|
|
/// Gets or sets the filter property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string Filter
|
|
{
|
|
get
|
|
{
|
|
return base.Filter;
|
|
}
|
|
set
|
|
{
|
|
base.Filter = value;
|
|
}
|
|
} // Filter
|
|
|
|
/// <summary>
|
|
/// Gets or sets the include property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Include
|
|
{
|
|
get
|
|
{
|
|
return base.Include;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Include = value;
|
|
} // set
|
|
} // Include
|
|
|
|
/// <summary>
|
|
/// Gets or sets the exclude property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Exclude
|
|
{
|
|
get
|
|
{
|
|
return base.Exclude;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Exclude = value;
|
|
} // set
|
|
} // Exclude
|
|
|
|
/// <summary>
|
|
/// Gets or sets the pass through property which determines
|
|
/// if the object that is set should be written to the pipeline.
|
|
/// Defaults to false.
|
|
/// </summary>
|
|
///
|
|
[Parameter]
|
|
public SwitchParameter PassThru
|
|
{
|
|
get
|
|
{
|
|
return passThrough;
|
|
}
|
|
|
|
set
|
|
{
|
|
passThrough = value;
|
|
}
|
|
} // PassThru
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the move-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
if (Path != null && Path.Length > 0)
|
|
{
|
|
return InvokeProvider.Item.MoveItemDynamicParameters(Path[0], Destination, context);
|
|
}
|
|
return InvokeProvider.Item.MoveItemDynamicParameters(".", Destination, context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return base.DoesProviderSupportShouldProcess (paths);
|
|
}
|
|
}
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The path of the item to move. It is set or retrieved via
|
|
/// the Path property.
|
|
/// </summary>
|
|
private string[] paths;
|
|
|
|
/// <summary>
|
|
/// The destination of the move
|
|
/// </summary>
|
|
private string destination = ".";
|
|
|
|
/// <summary>
|
|
/// Determines if the object being set should be written to the pipeline.
|
|
/// Defaults to false.
|
|
/// </summary>
|
|
private bool passThrough;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
private Collection<PathInfo> GetResolvedPaths(string path)
|
|
{
|
|
Collection<PathInfo> results = new Collection<PathInfo>();
|
|
try
|
|
{
|
|
results = SessionState.Path.GetResolvedPSPathFromPSPath(path);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Moves the specified item to the specified destination
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
foreach (string path in Path)
|
|
{
|
|
if(base.SuppressWildcardExpansion)
|
|
{
|
|
MoveItem(path);
|
|
}
|
|
else
|
|
{
|
|
Collection<PathInfo> resolvedPaths = GetResolvedPaths(path);
|
|
|
|
foreach (PathInfo resolvedPathInfo in resolvedPaths)
|
|
{
|
|
string resolvedPath = resolvedPathInfo.Path;
|
|
MoveItem(resolvedPath);
|
|
}
|
|
}
|
|
}
|
|
} // ProcessRecord
|
|
|
|
private void MoveItem(string path)
|
|
{
|
|
CmdletProviderContext currentContext = CmdletProviderContext;
|
|
|
|
do
|
|
{
|
|
try
|
|
{
|
|
string escapedPath = path;
|
|
if(! base.SuppressWildcardExpansion) { escapedPath = WildcardPattern.Escape(path); }
|
|
if (!InvokeProvider.Item.Exists(escapedPath, currentContext))
|
|
{
|
|
PSInvalidOperationException invalidOperation =
|
|
(PSInvalidOperationException)
|
|
PSTraceSource.NewInvalidOperationException(
|
|
NavigationResources.MoveItemDoesntExist,
|
|
path);
|
|
|
|
WriteError(
|
|
new ErrorRecord(
|
|
invalidOperation.ErrorRecord,
|
|
invalidOperation));
|
|
continue;
|
|
}
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
|
|
|
|
// See if the item to be moved is in use.
|
|
bool isCurrentLocationOrAncestor = false;
|
|
try
|
|
{
|
|
isCurrentLocationOrAncestor = SessionState.Path.IsCurrentLocationOrAncestor(path, currentContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
|
|
if (isCurrentLocationOrAncestor)
|
|
{
|
|
PSInvalidOperationException invalidOperation =
|
|
(PSInvalidOperationException)
|
|
PSTraceSource.NewInvalidOperationException(
|
|
NavigationResources.MoveItemInUse,
|
|
path);
|
|
|
|
WriteError(
|
|
new ErrorRecord(
|
|
invalidOperation.ErrorRecord,
|
|
invalidOperation));
|
|
continue;
|
|
}
|
|
|
|
// Default to the CmdletProviderContext that will direct output to
|
|
// the pipeline.
|
|
|
|
CmdletProviderContext currentCommandContext = currentContext;
|
|
currentCommandContext.PassThru = PassThru;
|
|
|
|
tracer.WriteLine("Moving {0} to {1}", path, Destination);
|
|
|
|
try
|
|
{
|
|
// Now do the move
|
|
string escapedPath = path;
|
|
if(! base.SuppressWildcardExpansion) { escapedPath = WildcardPattern.Escape(path); }
|
|
InvokeProvider.Item.Move(escapedPath, Destination, currentCommandContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
}
|
|
while(false);
|
|
}
|
|
#endregion Command code
|
|
|
|
} // MoveItemCommand
|
|
|
|
#endregion MoveItemCommand
|
|
|
|
#region RenameItemCommand
|
|
|
|
/// <summary>
|
|
/// Renames a specified item to a new name using the namespace providers
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.Rename, "Item", SupportsShouldProcess = true, SupportsTransactions = true, DefaultParameterSetName = "ByPath",
|
|
HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113382")]
|
|
public class RenameItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path property
|
|
/// </summary>
|
|
[Parameter(Position=0, Mandatory = true, ValueFromPipeline=true, ValueFromPipelineByPropertyName = true, ParameterSetName = "ByPath")]
|
|
public string Path
|
|
{
|
|
get
|
|
{
|
|
return path;
|
|
}
|
|
set
|
|
{
|
|
path = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path property
|
|
/// </summary>
|
|
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, ParameterSetName = "ByLiteralPath")]
|
|
[Alias("PSPath")]
|
|
public string LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return path;
|
|
}
|
|
set
|
|
{
|
|
path = value;
|
|
base.SuppressWildcardExpansion = true;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the newName property
|
|
/// </summary>
|
|
[Parameter(Position=1,Mandatory=true,ValueFromPipelineByPropertyName = true)]
|
|
public string NewName
|
|
{
|
|
get
|
|
{
|
|
return newName;
|
|
}
|
|
set
|
|
{
|
|
newName = value;
|
|
}
|
|
} // Name
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
/// </remarks>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
}
|
|
set
|
|
{
|
|
base.Force = value;
|
|
}
|
|
} // Force
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the pass through property which determines
|
|
/// if the object that is set should be written to the pipeline.
|
|
/// Defaults to false.
|
|
/// </summary>
|
|
///
|
|
[Parameter]
|
|
public SwitchParameter PassThru
|
|
{
|
|
get
|
|
{
|
|
return passThrough;
|
|
}
|
|
|
|
set
|
|
{
|
|
passThrough = value;
|
|
}
|
|
} // PassThru
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the rename-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
return InvokeProvider.Item.RenameItemDynamicParameters(Path, NewName, context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return base.DoesProviderSupportShouldProcess (new string[] { path });
|
|
}
|
|
}
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The path of the item to rename. It is set or retrieved via
|
|
/// the Path property.
|
|
/// </summary>
|
|
private string path;
|
|
|
|
/// <summary>
|
|
/// The new name of the item being renamed
|
|
/// </summary>
|
|
private string newName;
|
|
|
|
/// <summary>
|
|
/// Determines if the object being set should be written to the pipeline.
|
|
/// Defaults to false.
|
|
/// </summary>
|
|
private bool passThrough;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Moves the specified item to the specified destination
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
CmdletProviderContext currentContext = CmdletProviderContext;
|
|
|
|
try
|
|
{
|
|
if (!InvokeProvider.Item.Exists(Path, currentContext))
|
|
{
|
|
PSInvalidOperationException invalidOperation =
|
|
(PSInvalidOperationException)
|
|
PSTraceSource.NewInvalidOperationException(
|
|
NavigationResources.RenameItemDoesntExist,
|
|
Path);
|
|
|
|
WriteError(
|
|
new ErrorRecord(
|
|
invalidOperation.ErrorRecord,
|
|
invalidOperation));
|
|
return;
|
|
}
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
return;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
return;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
return;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
return;
|
|
}
|
|
|
|
// See if the item to be moved is in use.
|
|
bool isCurrentLocationOrAncestor = false;
|
|
try
|
|
{
|
|
isCurrentLocationOrAncestor = SessionState.Path.IsCurrentLocationOrAncestor(path, currentContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
return;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
return;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
return;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
return;
|
|
}
|
|
|
|
if (isCurrentLocationOrAncestor)
|
|
{
|
|
PSInvalidOperationException invalidOperation =
|
|
(PSInvalidOperationException)
|
|
PSTraceSource.NewInvalidOperationException(
|
|
NavigationResources.RenamedItemInUse,
|
|
Path);
|
|
|
|
WriteError(
|
|
new ErrorRecord(
|
|
invalidOperation.ErrorRecord,
|
|
invalidOperation));
|
|
return;
|
|
}
|
|
|
|
// Default to the CmdletProviderContext that will direct output to
|
|
// the pipeline.
|
|
|
|
currentContext.PassThru = PassThru;
|
|
|
|
tracer.WriteLine ("Rename {0} to {1}", Path, NewName);
|
|
|
|
try
|
|
{
|
|
// Now do the rename
|
|
InvokeProvider.Item.Rename(Path, NewName, currentContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
return;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
return;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
return;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
return;
|
|
}
|
|
|
|
} // ProcessRecord
|
|
#endregion Command code
|
|
|
|
} // RenameItemCommand
|
|
|
|
#endregion RenameItemCommand
|
|
|
|
#region CopyItemCommand
|
|
|
|
/// <summary>
|
|
/// Copies a specified item to a new location using the namespace providers
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.Copy, "Item", DefaultParameterSetName = "Path", SupportsShouldProcess = true, SupportsTransactions = true,
|
|
HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113292")]
|
|
public class CopyItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
/// <summary>
|
|
/// Gets or sets the path property
|
|
/// </summary>
|
|
[Parameter(Position=0, ParameterSetName = "Path",
|
|
Mandatory = true, ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)]
|
|
public string[] Path
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
}
|
|
set
|
|
{
|
|
paths = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path parameter to the command
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "LiteralPath",
|
|
Mandatory = true, ValueFromPipeline=false, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string[] LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
paths = value;
|
|
} // set
|
|
} // LiteralPath
|
|
|
|
/// <summary>
|
|
/// Gets or sets the destination property
|
|
/// </summary>
|
|
[Parameter(Position=1,ValueFromPipelineByPropertyName = true)]
|
|
public string Destination
|
|
{
|
|
get
|
|
{
|
|
return destination;
|
|
}
|
|
set
|
|
{
|
|
destination = value;
|
|
}
|
|
} // Destination
|
|
|
|
/// <summary>
|
|
/// Gets or sets the container property
|
|
/// </summary>
|
|
[Parameter]
|
|
public SwitchParameter Container
|
|
{
|
|
get
|
|
{
|
|
return container;
|
|
}
|
|
set
|
|
{
|
|
containerSpecified = true;
|
|
container = value;
|
|
}
|
|
} // Container
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
/// </remarks>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
}
|
|
set
|
|
{
|
|
base.Force = value;
|
|
}
|
|
} // Force
|
|
|
|
/// <summary>
|
|
/// Gets or sets the filter property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string Filter
|
|
{
|
|
get
|
|
{
|
|
return base.Filter;
|
|
}
|
|
set
|
|
{
|
|
base.Filter = value;
|
|
}
|
|
} // Filter
|
|
|
|
/// <summary>
|
|
/// Gets or sets the include property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Include
|
|
{
|
|
get
|
|
{
|
|
return base.Include;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Include = value;
|
|
} // set
|
|
} // Include
|
|
|
|
/// <summary>
|
|
/// Gets or sets the exclude property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Exclude
|
|
{
|
|
get
|
|
{
|
|
return base.Exclude;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Exclude = value;
|
|
} // set
|
|
} // Exclude
|
|
|
|
/// <summary>
|
|
/// Gets or sets the recurse property
|
|
/// </summary>
|
|
[Parameter]
|
|
public SwitchParameter Recurse
|
|
{
|
|
get
|
|
{
|
|
return recurse;
|
|
}
|
|
set
|
|
{
|
|
recurse = value;
|
|
|
|
// If -Container is not specified but -Recurse
|
|
// is, then -Container takes on the same value
|
|
// as -Recurse
|
|
|
|
if (!containerSpecified)
|
|
{
|
|
container = recurse;
|
|
}
|
|
}
|
|
} // Recurse
|
|
|
|
/// <summary>
|
|
/// Gets or sets the pass through property which determines
|
|
/// if the object that is set should be written to the pipeline.
|
|
/// Defaults to false.
|
|
/// </summary>
|
|
///
|
|
[Parameter]
|
|
public SwitchParameter PassThru
|
|
{
|
|
get
|
|
{
|
|
return passThrough;
|
|
}
|
|
|
|
set
|
|
{
|
|
passThrough = value;
|
|
}
|
|
} // PassThru
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the copy-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
if (Path != null && Path.Length > 0)
|
|
{
|
|
return InvokeProvider.Item.CopyItemDynamicParameters(Path[0], Destination, Recurse, context);
|
|
}
|
|
return InvokeProvider.Item.CopyItemDynamicParameters(".", Destination, Recurse, context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return base.DoesProviderSupportShouldProcess (paths);
|
|
}
|
|
}
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The path of the item to copy. It is set or retrieved via
|
|
/// the Path property.
|
|
/// </summary>
|
|
private string[] paths;
|
|
|
|
/// <summary>
|
|
/// The destination of the item being copied
|
|
/// </summary>
|
|
private string destination;
|
|
|
|
/// <summary>
|
|
/// Determines if the containers should be copied with the items or not.
|
|
/// </summary>
|
|
private bool container = true;
|
|
private bool containerSpecified;
|
|
|
|
/// <summary>
|
|
/// Determines if the copy command should recurse into
|
|
/// sub-containers.
|
|
/// </summary>
|
|
private bool recurse;
|
|
|
|
/// <summary>
|
|
/// Determines if the object being set should be written to the pipeline.
|
|
/// Defaults to false.
|
|
/// </summary>
|
|
private bool passThrough;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Copies the specified item(s) to the specified destination
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
CmdletProviderContext currentCommandContext = CmdletProviderContext;
|
|
currentCommandContext.PassThru = PassThru;
|
|
|
|
foreach (string path in paths)
|
|
{
|
|
tracer.WriteLine ("Copy {0} to {1}", path, Destination);
|
|
|
|
try
|
|
{
|
|
CopyContainers copyContainers = (Container) ? CopyContainers.CopyTargetContainer : CopyContainers.CopyChildrenOfTargetContainer;
|
|
|
|
// Now do the copy
|
|
InvokeProvider.Item.Copy(path, Destination, Recurse, copyContainers, currentCommandContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
|
|
}
|
|
} // ProcessRecord
|
|
#endregion Command code
|
|
|
|
} // CopyItemCommand
|
|
|
|
#endregion CopyItemCommand
|
|
|
|
#region ClearItemCommand
|
|
|
|
/// <summary>
|
|
/// Clears an item at the specified location
|
|
/// </summary>
|
|
[Cmdlet (VerbsCommon.Clear, "Item", DefaultParameterSetName = "Path", SupportsShouldProcess = true, SupportsTransactions = true,
|
|
HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113283")]
|
|
public class ClearItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
/// <summary>
|
|
/// Gets or sets the path property
|
|
/// </summary>
|
|
[Parameter(Position=0, ParameterSetName = "Path",
|
|
Mandatory = true, ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)]
|
|
public string[] Path
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
}
|
|
set
|
|
{
|
|
paths = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path parameter to the command
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "LiteralPath",
|
|
Mandatory = true, ValueFromPipeline=false, ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string[] LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
paths = value;
|
|
} // set
|
|
} // LiteralPath
|
|
|
|
/// <summary>
|
|
/// Gets or sets the force property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Gives the provider guidance on how vigorous it should be about performing
|
|
/// the operation. If true, the provider should do everything possible to perform
|
|
/// the operation. If false, the provider should attempt the operation but allow
|
|
/// even simple errors to terminate the operation.
|
|
/// For example, if the user tries to copy a file to a path that already exists and
|
|
/// the destination is read-only, if force is true, the provider should copy over
|
|
/// the existing read-only file. If force is false, the provider should write an error.
|
|
/// </remarks>
|
|
///
|
|
[Parameter]
|
|
public override SwitchParameter Force
|
|
{
|
|
get
|
|
{
|
|
return base.Force;
|
|
}
|
|
set
|
|
{
|
|
base.Force = value;
|
|
}
|
|
} // Force
|
|
|
|
/// <summary>
|
|
/// Gets or sets the filter property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string Filter
|
|
{
|
|
get
|
|
{
|
|
return base.Filter;
|
|
}
|
|
set
|
|
{
|
|
base.Filter = value;
|
|
}
|
|
} // Filter
|
|
|
|
/// <summary>
|
|
/// Gets or sets the include property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Include
|
|
{
|
|
get
|
|
{
|
|
return base.Include;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Include = value;
|
|
} // set
|
|
} // Include
|
|
|
|
/// <summary>
|
|
/// Gets or sets the exclude property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Exclude
|
|
{
|
|
get
|
|
{
|
|
return base.Exclude;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Exclude = value;
|
|
} // set
|
|
} // Exclude
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the clear-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
if (Path != null && Path.Length > 0)
|
|
{
|
|
return InvokeProvider.Item.ClearItemDynamicParameters(Path[0], context);
|
|
}
|
|
return InvokeProvider.Item.ClearItemDynamicParameters(".", context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return base.DoesProviderSupportShouldProcess (paths);
|
|
}
|
|
}
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The path of the item to move. It is set or retrieved via
|
|
/// the Path property.
|
|
/// </summary>
|
|
private string[] paths;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Clears the specified item
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
|
|
// Default to the CmdletProviderContext that will direct output to
|
|
// the pipeline.
|
|
|
|
CmdletProviderContext currentCommandContext = CmdletProviderContext;
|
|
currentCommandContext.PassThru = false;
|
|
|
|
foreach (string path in paths)
|
|
{
|
|
tracer.WriteLine ("Clearing {0}", path);
|
|
|
|
try
|
|
{
|
|
// Now do the move
|
|
InvokeProvider.Item.Clear(path, currentCommandContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
|
|
}
|
|
} // ProcessRecord
|
|
#endregion Command code
|
|
|
|
} // ClearItemCommand
|
|
|
|
#endregion ClearItemCommand
|
|
|
|
#region InvokeItemCommand
|
|
|
|
/// <summary>
|
|
/// Invokes an item at the specified location
|
|
/// </summary>
|
|
[Cmdlet ("Invoke", "Item", DefaultParameterSetName = "Path", SupportsShouldProcess = true, SupportsTransactions = true,
|
|
HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113345")]
|
|
public class InvokeItemCommand : CoreCommandWithCredentialsBase
|
|
{
|
|
#region Command parameters
|
|
/// <summary>
|
|
/// Gets or sets the path property
|
|
/// </summary>
|
|
[Parameter(Position=0, ParameterSetName = "Path",
|
|
Mandatory = true,ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)]
|
|
public string[] Path
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
}
|
|
set
|
|
{
|
|
paths = value;
|
|
}
|
|
} // Path
|
|
|
|
/// <summary>
|
|
/// Gets or sets the literal path parameter to the command
|
|
/// </summary>
|
|
[Parameter(ParameterSetName = "LiteralPath",
|
|
Mandatory = true, ValueFromPipeline=false,ValueFromPipelineByPropertyName = true)]
|
|
[Alias("PSPath")]
|
|
public string[] LiteralPath
|
|
{
|
|
get
|
|
{
|
|
return paths;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.SuppressWildcardExpansion = true;
|
|
paths = value;
|
|
} // set
|
|
} // LiteralPath
|
|
|
|
/// <summary>
|
|
/// Gets or sets the filter property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string Filter
|
|
{
|
|
get
|
|
{
|
|
return base.Filter;
|
|
}
|
|
set
|
|
{
|
|
base.Filter = value;
|
|
}
|
|
} // Filter
|
|
|
|
/// <summary>
|
|
/// Gets or sets the include property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Include
|
|
{
|
|
get
|
|
{
|
|
return base.Include;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Include = value;
|
|
} // set
|
|
} // Include
|
|
|
|
/// <summary>
|
|
/// Gets or sets the exclude property
|
|
/// </summary>
|
|
[Parameter]
|
|
public override string[] Exclude
|
|
{
|
|
get
|
|
{
|
|
return base.Exclude;
|
|
} // get
|
|
|
|
set
|
|
{
|
|
base.Exclude = value;
|
|
} // set
|
|
} // Exclude
|
|
|
|
/// <summary>
|
|
/// Gets the dynamic parameters for the invoke-item cmdlet.
|
|
/// </summary>
|
|
///
|
|
/// <param name="context">
|
|
/// The context under which the command is running.
|
|
/// </param>
|
|
///
|
|
/// <returns>
|
|
/// An object representing the dynamic parameters for the cmdlet or null if there
|
|
/// are none.
|
|
/// </returns>
|
|
///
|
|
internal override object GetDynamicParameters(CmdletProviderContext context)
|
|
{
|
|
if (Path != null && Path.Length > 0)
|
|
{
|
|
return InvokeProvider.Item.InvokeItemDynamicParameters(Path[0], context);
|
|
}
|
|
return InvokeProvider.Item.InvokeItemDynamicParameters(".", context);
|
|
} // GetDynamicParameters
|
|
|
|
/// <summary>
|
|
/// Determines if the provider for the specified path supports ShouldProcess
|
|
/// </summary>
|
|
/// <value></value>
|
|
protected override bool ProviderSupportsShouldProcess
|
|
{
|
|
get
|
|
{
|
|
return base.DoesProviderSupportShouldProcess(paths);
|
|
}
|
|
}
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The path of the item to move. It is set or retrieved via
|
|
/// the Path property.
|
|
/// </summary>
|
|
private string[] paths;
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Invokes the specified item
|
|
/// </summary>
|
|
protected override void ProcessRecord ()
|
|
{
|
|
|
|
foreach (string path in paths)
|
|
{
|
|
tracer.WriteLine ("Invoking {0}", path);
|
|
|
|
try
|
|
{
|
|
// Now invoke the action
|
|
InvokeProvider.Item.Invoke(path, CmdletProviderContext);
|
|
}
|
|
catch (PSNotSupportedException notSupported)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
notSupported.ErrorRecord,
|
|
notSupported));
|
|
continue;
|
|
}
|
|
catch (DriveNotFoundException driveNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
driveNotFound.ErrorRecord,
|
|
driveNotFound));
|
|
continue;
|
|
}
|
|
catch (ProviderNotFoundException providerNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
providerNotFound.ErrorRecord,
|
|
providerNotFound));
|
|
continue;
|
|
}
|
|
catch (ItemNotFoundException pathNotFound)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
pathNotFound.ErrorRecord,
|
|
pathNotFound));
|
|
continue;
|
|
}
|
|
|
|
}
|
|
} // ProcessRecord
|
|
#endregion Command code
|
|
|
|
} // InvokeItemCommand
|
|
|
|
#endregion InvokeItemCommand
|
|
|
|
#endregion Item commands
|
|
|
|
#region Provider commands
|
|
|
|
#region GetProviderCommand
|
|
|
|
/// <summary>
|
|
/// Gets a core command provider by name
|
|
/// </summary>
|
|
[Cmdlet(VerbsCommon.Get, "PSProvider", HelpUri = "http://go.microsoft.com/fwlink/?LinkID=113329")]
|
|
[OutputType(typeof(ProviderInfo))]
|
|
public class GetPSProviderCommand : CoreCommandBase
|
|
{
|
|
#region Command parameters
|
|
|
|
/// <summary>
|
|
/// Gets or sets the provider that will be removed.
|
|
/// </summary>
|
|
///
|
|
[Parameter(Position=0,ValueFromPipelineByPropertyName = true)]
|
|
public string[] PSProvider
|
|
{
|
|
get
|
|
{
|
|
return provider;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
provider = new string[0];
|
|
}
|
|
else
|
|
{
|
|
provider = value;
|
|
}
|
|
}
|
|
} // Provider
|
|
|
|
#endregion Command parameters
|
|
|
|
#region Command data
|
|
/// <summary>
|
|
/// The string ID of the provider to remove.
|
|
/// </summary>
|
|
private string[] provider = new string[0];
|
|
|
|
#endregion Command data
|
|
|
|
#region Command code
|
|
|
|
/// <summary>
|
|
/// Gets a provider from the core command namespace.
|
|
/// </summary>
|
|
protected override void ProcessRecord()
|
|
{
|
|
if (PSProvider == null ||
|
|
(PSProvider != null &&
|
|
PSProvider.Length == 0))
|
|
{
|
|
// Get all the providers
|
|
|
|
WriteObject(SessionState.Provider.GetAll(), true);
|
|
}
|
|
else
|
|
{
|
|
foreach (string requestedProvider in PSProvider)
|
|
{
|
|
PSSnapinQualifiedName pssnapinQualifiedProvider = PSSnapinQualifiedName.GetInstance(requestedProvider);
|
|
|
|
if (pssnapinQualifiedProvider != null && WildcardPattern.ContainsWildcardCharacters(pssnapinQualifiedProvider.ShortName))
|
|
{
|
|
// The user entered a glob string so use the WildcardPattern to
|
|
// compare the glob string to the provider names that exist
|
|
// and write out any that match
|
|
|
|
WildcardPattern matcher =
|
|
WildcardPattern.Get(
|
|
pssnapinQualifiedProvider.ShortName,
|
|
WildcardOptions.IgnoreCase);
|
|
|
|
foreach (ProviderInfo enumeratedProvider in SessionState.Provider.GetAll())
|
|
{
|
|
Dbg.Diagnostics.Assert(
|
|
enumeratedProvider != null,
|
|
"SessionState.Providers should return only ProviderInfo objects");
|
|
|
|
if (enumeratedProvider.IsMatch(matcher, pssnapinQualifiedProvider))
|
|
{
|
|
// A match was found
|
|
|
|
WriteObject(enumeratedProvider);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
Collection<ProviderInfo> matchingProviders =
|
|
SessionState.Provider.Get(requestedProvider);
|
|
|
|
// The provider was found
|
|
|
|
WriteObject(matchingProviders, true);
|
|
}
|
|
catch (ProviderNotFoundException e)
|
|
{
|
|
WriteError(
|
|
new ErrorRecord(
|
|
e.ErrorRecord,
|
|
e));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} // ProcessRecord
|
|
|
|
|
|
#endregion Command code
|
|
|
|
} // GetProviderCommand
|
|
|
|
#endregion GetProviderCommand
|
|
|
|
#endregion Provider commands
|
|
} // namespace Microsoft.PowerShell.Commands
|
|
|