Командлет Powershell: определение фактического пути к файлу в локальном каталоге - PullRequest
2 голосов
/ 28 марта 2012

У меня есть собственный командлет, который можно вызвать так:

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

Ответы [ 5 ]

1 голос
/ 01 апреля 2012

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

1 голос
/ 29 марта 2012

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

0 голосов
/ 08 февраля 2013
    /// <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);
    }
0 голосов
/ 28 марта 2012

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

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

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

В качестве альтернативы может работать что-то вроде:

this.SessionState.Path

.

0 голосов
/ 28 марта 2012

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

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