2012-03-28 1 views
2

У меня есть собственный командлет, который можно назвать так:Powershell Cmdlet: Определить фактический путь_к_файлу файла в локальном каталоге

Get-Info ".\somefile.txt" 

Мой commandlet код выглядит примерно так:

[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. По какой-то причине мой командлет не обнаруживает рабочий каталог, поэтому локальные файлы, подобные этому, не работают. В C#, каков рекомендуемый способ обнаружения правильного пути к файлу, когда предоставляется локальный путь «. \»?

+0

Вы пробовали: [Environment.CurrentDirectory] (http://msdn.microsoft.com/en-us/library/system.environment.currentdirectory.aspx) –

+0

Да у меня есть, результат «C : \ Users \ Philip \ ' – Phil

+0

Это, по-видимому, по дизайну: http://www.windowsitpro.com/article/windows-powershell/why-the-powershell-working-directory-and-the-powershell-location-aren- трет-один-в-то же самое. 'Внутри PowerShell, ваше местоположение - C: \ tmp. Тем не менее, ваш рабочий каталог по-прежнему будет C: \ Users \ JaneUser' – mellamokb

ответ

1

На данный момент я использую GetUnresolvedProviderPathFromPsPath. Однако я мог бы разработать свой командлет еще немного в соответствии с рекомендациями Microsoft с помощью this stackoverflow question, и именно этого я и ищу. Ответ там чрезвычайно всеобъемлющий. Я не хочу удалять этот вопрос, но я проголосовал за его закрытие, поскольку этот вопрос является точным дубликатом, и ответ там лучше.

0

Вы пробовали:

File.Open(Path.GetFullPath(FilePath)) 
+0

Да, у меня есть полный путь, который он получает: 'C: \ Users \ Philip \ somefile.txt' – Phil

0

Вы должны быть в состоянии использовать что-то вроде:

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

Если вы унаследовали от PSCmdlet вместо Cmdlet. Source

С другой стороны, что-то вроде:

this.SessionState.Path 

может работать.

1

Посмотрите на свойство Path свойства SessionState. Он имеет некоторые служебные функции, обычно используемые для разрешения относительного пути. Выбор зависит от того, хотите ли вы поддерживать подстановочные знаки. Это может быть полезно forum post.

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); 
    }