.NET Frameworkで相対パスを扱う

 PowerShellで扱っているカレントディレクトリと、.NET Frameworkのカレントディレクトリは一般には一致しません。

PS U:\Work> [IO.Directory]::GetCurrentDirectory()
C:\Users\Hojo
PS U:\Work>

 そのため、PowerShellを通して.NET Frameworkの入出力処理をしようとするとパスを誤認してしまいます。下記の例では、PowerShellのカレントディレクトリがU:\Workであるのに、 .NETではC:\Users\Hojo\TestFile.txtを探してしまっています。

PS U:\Work> [IO.File]::OpenRead('.\TestFile.txt')
"1" 個の引数を指定して "OpenRead" を呼び出し中に例外が発生しました: "ファイル 'C:\Users\Hojo\TestFile.txt' が見つかりませんでした。"
発生場所 行:1 文字:20
+ [IO.File]::OpenRead <<<< ('.\TestFile.txt')
    + CategoryInfo          : NotSpecified: (:) []、MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

PS U:\Work>

 PowerShellを通して.NET Frameworkの相対パス処理を行うには、まず.NET Frameworkのカレントディレクトリを変更します。

PS U:\Work> [IO.Directory]::SetCurrentDirectory(
>> (Get-Location).Path)
>>
PS U:\Work> [IO.Directory]::GetCurrentDirectory()
U:\Work
PS U:\Work>

 これで相対パスを正しく扱えるようになります。

inserted by FC2 system