PowerShellのSystem.IO名前空間で相対パスが参照できない

toc目次

System.IO名前空間で相対パスが参照できない

以下、PowerShellでSystem.IO名前空間のFile.Existsメソッドを使用して「C:\sample\sample.txt」の存在を確認する例です。

PS > Set-Location C:\sample

PS > Get-Location

Path
----
C:\sample

PS > Get-ChildItem -Name
sample.txt

PS > [IO.File]::Exists("C:\sample\sample.txt")
True

PS > [IO.File]::Exists("sample.txt")
False

絶対パスで指定ではTrueとなりますが、相対パス指定ではFalseとなります。

System.IO名前空間で相対パスが参照できない原因

相対パスが参照できない原因は、System.IO名前空間でのカレントディレクトリーが、PowerShellのカレントディレクトリーではないためです。

System.IO名前空間でのカレントディレクトリーは、Directory.GetCurrentDirectoryメソッドで参照できます。

PS > [IO.Directory]::GetCurrentDirectory()
C:\Users\username

デフォルトではC:\Users\{ユーザー名}となっています。

System.IO名前空間の相対パスを変更する方法

System.IO名前空間でのカレントディレクトリーは、Directory.SetCurrentDirectoryメソッドで変更できます。

PS > [IO.Directory]::SetCurrentDirectory("C:\sample")

PS > [IO.Directory]::GetCurrentDirectory()
C:\sample

PS > [IO.File]::Exists("sample.txt")
True

Directory.SetCurrentDirectoryメソッドでカレントディレクトリーを変更すると、相対パス指定も正しく認識できます。