PowerShell 如何轉換絕對路徑 ( GetFullPath()函式錯誤路徑跑到C曹 )
有常在寫腳本的應該經常遇到莫名其妙路徑錯誤的問題,其中一個很大的坑就是C#的路徑有時候未必會跟當前工作目錄一樣
如何獲取C#的路徑可以使用這個函式獲取
PS1 檔案
[IO.Directory]::GetCurrentDirectory()
BAT檔案
powershell.exe -nop "[IO.Directory]::GetCurrentDirectory()"
pause
下面舉例幾種情況來說明什麼時候會遇到不同步問題,如果沒有注意到可能當下就直接報錯了,然後莫名其妙不知道怎樣
要重現這個bug在啟終端機之後利用cd切換目錄然後再執行 [IO.Path]::GetFullPath(".\")
就會看到路徑錯了
工作路徑與C#同步的情況
下面取幾種情境來說明預設的C#預設路徑會跟工作路徑一樣的情況
- 按住Shift然後在資料夾背景按右鍵在這裡開啟
- 直接按右鍵在終端機開啟
- 在Bat檔案中呼叫PowerShell (Win10 21H1)
工作路徑與C#不同步的情況
- 打開終端機之後使用cd切換到其他目錄
- 在Bat檔案中呼叫PowerShell (Win10 1909)
* Win10版本問題我不確定具體是哪一版改的,在舊版本執行採過坑,喵的找了好久才發現...
如何正確獲取絕對路徑
這邊有幾個方法可以處理
第一個是一行可以處理的,利用Combine函式把相對路徑跟當前工作目錄組合在丟進去GetFullPath修正其他可能遇到的Bug路徑。
$Path = [IO.Path]::GetFullPath([IO.Path]::Combine((Get-Location -PSProvider FileSystem).ProviderPath, $Path))
第二個方法是直接把C#變更成當然工作目錄,這樣就不會遇到路徑不同步組出奇怪的絕對路徑了
[IO.Directory]::SetCurrentDirectory(((Get-Location -PSProvider FileSystem).ProviderPath))
$Path = [IO.Path]::GetFullPath($Path)
第三個方法是用PowerShell內建的函式,不過有個很現實的問題是這個函式必須檔案真實存在才可以轉,如果不存在會報錯
$Path = Convert-Path $Path
沒有留言:
張貼留言