2

次のように呼び出すことができるカスタムコマンドレットがあります。

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#で、ローカルの「。\」ファイルパスが指定されている場合に正しいファイルパスを検出するための推奨される方法は何ですか?

4

5 に答える 5

1

SessionStateプロパティのPathプロパティを確認してください。相対パスを解決するために一般的に使用されるいくつかのユーティリティ関数があります。選択肢は、ワイルドカードをサポートするかどうかによって異なります。このフォーラムの投稿は役に立つかもしれません。

于 2012-03-29T07:24:31.847 に答える
1

今のところ、GetUnresolvedProviderPathFromPsPathを使用しています。ただし、このスタックオーバーフローの質問の助けを借りて、Microsoftのガイドラインに従って、コマンドレットをもう少し設計することができました。これはまさに私が探しているものです。そこでの答えは非常に包括的です。この質問を削除したくありませんが、この質問は完全に重複しており、回答の方が優れているため、この質問を閉じることに投票しました。

于 2012-04-01T13:19:18.693 に答える
0

やってみました:

File.Open(Path.GetFullPath(FilePath))
于 2012-03-28T19:23:23.923 に答える
0

次のようなものを使用できるはずです。

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

PSCmdletの代わりにから継承する場合Cmdletソース

または、次のようになります。

this.SessionState.Path

うまくいくかもしれません。

于 2012-03-28T19:28:15.570 に答える
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);
    }
于 2013-02-07T20:19:43.690 に答える