PowerShellのSystem.IO名前空間で相対パスが参照できない
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メソッドでカレントディレクトリーを変更すると、相対パス指定も正しく認識できます。