Powershell Cmdlet:确定本地目录中文件的实际文件路径

时间:2012-03-28 19:14:28

标签: c# powershell filepath cmdlets

我有一个可以像这样调用的自定义cmdlet:

Get-Info ".\somefile.txt"

我的命令行开关代码如下所示:

[Parameter(Mandatory = true, Position = 0)]
public string FilePath { get; set; }

protected override void ProcessRecord()
{
    using (var stream = File.Open(FilePath))
    {
        // Do work
    }
}

然而,当我运行命令时,我收到此错误:

Could not find file 'C:\Users\Philip\somefile.txt'

我没有从C:\Users\Philip执行此cmdlet。由于某种原因,我的cmdlet没有检测到工作目录,因此像这样的本地文件不起作用。在C#中,当提供本地“。\”文件路径时,建议检测正确文件路径的方法是什么?

5 个答案:

答案 0 :(得分:1)

查看SessionState属性的Path属性。它具有一些常用于解析相对路径的实用功能。选择取决于您是否要支持通配符。这个forum post可能很有用。

答案 1 :(得分:1)

目前我正在使用GetUnresolvedProviderPathFromPsPath。但是,我可以在this stackoverflow question的帮助下根据Microsoft指南设计我的cmdlet,这正是我正在寻找的。答案非常全面。我不想删除这个问题,但我已经投票决定关闭它,因为这个问题完全重复,答案更好。

答案 2 :(得分:0)

你试过了吗?

File.Open(Path.GetFullPath(FilePath))

答案 3 :(得分:0)

你应该可以使用类似的东西:

var currentDirectory = ((PathInfo)GetVariableValue("pwd")).Path;

如果您继承自PSCmdlet而非CmdletSource

或者,例如:

this.SessionState.Path

可能有用。

答案 4 :(得分:0)

    /// <summary>
    /// The member variable m_fname is populated by input parameter
    /// and accepts either absolute or relative path.
    /// This method will determine if the supplied parameter was fully qualified, 
    /// and if not then qualify it.
    /// </summary>
    protected override void InternalProcessRecord()
    {
        base.InternalProcessRecord();

        string fname = null;
        if (Path.IsPathRooted(m_fname))
            fname = m_fname;
        else
            fname = Path.Combine(this.SessionState.Path.CurrentLocation.ToString(), m_fname);

        // If the file doesn't exist
        if (!File.Exists(fname))
            throw new FileNotFoundException("File does not exist.", fname);
    }