2023年1月20日 星期五

PowerShell 如何轉換絕對路徑 ( GetFullPath()函式錯誤路徑跑到C曹 )

PowerShell 如何轉換絕對路徑 ( GetFullPath()函式錯誤路徑跑到C曹 )

有常在寫腳本的應該經常遇到莫名其妙路徑錯誤的問題,其中一個很大的坑就是C#的路徑有時候未必會跟當前工作目錄一樣

如何獲取C#的路徑可以使用這個函式獲取

PS1 檔案

[IO.Directory]::GetCurrentDirectory()

BAT檔案

powershell.exe -nop "[IO.Directory]::GetCurrentDirectory()"
pause

下面舉例幾種情況來說明什麼時候會遇到不同步問題,如果沒有注意到可能當下就直接報錯了,然後莫名其妙不知道怎樣

要重現這個bug在啟終端機之後利用cd切換目錄然後再執行 [IO.Path]::GetFullPath(".\") 就會看到路徑錯了


工作路徑與C#同步的情況

下面取幾種情境來說明預設的C#預設路徑會跟工作路徑一樣的情況

  1. 按住Shift然後在資料夾背景按右鍵在這裡開啟
  2. 直接按右鍵在終端機開啟
  3. 在Bat檔案中呼叫PowerShell (Win10 21H1)

工作路徑與C#不同步的情況

  1. 打開終端機之後使用cd切換到其他目錄
  2. 在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




沒有留言:

張貼留言