5
爲什麼在這種情況下輸出不是c:\source\temp\test.txt
?PowerShell FileInfo在子目錄中輸出文件
PS C:\source\temp> (New-Object IO.FileInfo .\test.txt).FullName
c:\source\test.txt
爲什麼在這種情況下輸出不是c:\source\temp\test.txt
?PowerShell FileInfo在子目錄中輸出文件
PS C:\source\temp> (New-Object IO.FileInfo .\test.txt).FullName
c:\source\test.txt
啊,這經常讓人們在PowerShell中出現。雖然PowerShell具有當前目錄的概念,但它與當前目錄不同。原因在於,Windows進程只能有一個當前目錄,而PowerShell進程可能有多個運行空間/管道,每個運行空間/管道都有自己的當前目錄,PowerShell當前目錄甚至可能不是文件位置。
採用相對路徑的.NET方法將根據進程的當前目錄進行解析。所以爲了安全起見,每當調用.NET方法時,都應該使用完全解析的路徑。你可以這樣做:
PS> (New-Object IO.FileInfo "$PWD\test.txt").FullName
$ PWD得到的字符串(因爲雙引號)和它的自動變量,它總是返回當前的工作目錄內擴展。它實際上返回一個PathInfo對象,因爲它嵌入的字符串可能並不總是絕對的物理路徑。如果你使用PSDrives(例如,我有一個temp:\驅動器映射到我的臨時目錄),你需要更加明確。
PS> (New-Object IO.FileInfo "$($PWD.ProviderPath)\test.txt").FullName
PowerShell專家可能有一個更簡潔的語法。上面的確是很醜陋。