/********************************************************************++
Copyright (c) Microsoft Corporation. All rights reserved.
--********************************************************************/
using System.Management.Automation;
using Dbg = System.Management.Automation;
namespace Microsoft.PowerShell.Commands
{
///
/// The valid values for the -PathType parameter for test-path
///
public enum TestPathType
{
///
/// If the item at the path exists, true will be returned.
///
Any,
///
/// If the item at the path exists and is a container, true will be returned.
///
Container,
///
/// If the item at the path exists and is not a container, true will be returned.
///
Leaf
}
///
/// A command to determine if an item exists at a specified path
///
[Cmdlet(VerbsDiagnostic.Test, "Path", DefaultParameterSetName = "Path", SupportsTransactions = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113418")]
[OutputType(typeof(bool))]
public class TestPathCommand : CoreCommandWithCredentialsBase
{
#region Parameters
///
/// Gets or sets the path parameter to the command
///
[Parameter(Position = 0, ParameterSetName = "Path",
Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
public string[] Path
{
get { return _paths; }
set { _paths = value; }
}
///
/// Gets or sets the literal path parameter to the command
///
[Parameter(ParameterSetName = "LiteralPath",
Mandatory = true, ValueFromPipeline = false, ValueFromPipelineByPropertyName = true)]
[Alias("PSPath")]
public string[] LiteralPath
{
get { return _paths; }
set
{
base.SuppressWildcardExpansion = true;
_paths = value;
}
}
///
/// Gets or sets the filter property
///
[Parameter]
public override string Filter
{
get { return base.Filter; }
set { base.Filter = value; }
}
///
/// Gets or sets the include property
///
[Parameter]
public override string[] Include
{
get { return base.Include; }
set { base.Include = value; }
}
///
/// Gets or sets the exclude property
///
[Parameter]
public override string[] Exclude
{
get { return base.Exclude; }
set { base.Exclude = value; }
}
///
/// Gets or sets the isContainer property
///
[Parameter]
[Alias("Type")]
public TestPathType PathType { get; set; } = TestPathType.Any;
///
/// Gets or sets the IsValid parameter
///
[Parameter]
public SwitchParameter IsValid { get; set; } = new SwitchParameter();
///
/// 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.
///
///
///
/// The context under which the command is running.
///
///
///
/// An object representing the dynamic parameters for the cmdlet or null if there
/// are none.
///
///
internal override object GetDynamicParameters(CmdletProviderContext context)
{
object result = null;
if (this.PathType == TestPathType.Any && !IsValid)
{
if (Path != null && Path.Length > 0)
{
result = InvokeProvider.Item.ItemExistsDynamicParameters(Path[0], context);
}
else
{
result = InvokeProvider.Item.ItemExistsDynamicParameters(".", context);
}
}
return result;
} // GetDynamicParameters
#endregion Parameters
#region parameter data
///
/// The path to the item to ping
///
private string[] _paths;
#endregion parameter data
#region Command code
///
/// Determines if an item at the specified path exists.
///
protected override void ProcessRecord()
{
CmdletProviderContext currentContext = CmdletProviderContext;
foreach (string path in _paths)
{
bool result = false;
try
{
if (IsValid)
{
result = SessionState.Path.IsValid(path, currentContext);
}
else
{
if (this.PathType == TestPathType.Container)
{
result = InvokeProvider.Item.IsContainer(path, currentContext);
}
else if (this.PathType == TestPathType.Leaf)
{
result =
InvokeProvider.Item.Exists(path, currentContext) &&
!InvokeProvider.Item.IsContainer(path, currentContext);
}
else
{
result = InvokeProvider.Item.Exists(path, currentContext);
}
}
}
// Any of the known exceptions means the path does not exist.
catch (PSNotSupportedException)
{
}
catch (DriveNotFoundException)
{
}
catch (ProviderNotFoundException)
{
}
catch (ItemNotFoundException)
{
}
WriteObject(result);
}
} // ProcessRecord
#endregion Command code
} // PingPathCommand
} // namespace Microsoft.PowerShell.Commands