我有一个可以像这样调用的自定义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#中,当提供本地“。\”文件路径时,建议检测正确文件路径的方法是什么?
答案 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
而非Cmdlet
。 Source
或者,例如:
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);
}