我需要存盤一個相對路徑,作為檔案中的絕對路徑。我嘗試了很多東西,包括:
$path = (resolve-path -path "C:\Folder\..\Folder2").Path.ToString()
Add-content "d:\textfile.txt" $path
這留下了一個 empy 檔案。所以我很難過。
uj5u.com熱心網友回復:
到最簡單的方法解決一個相對和/或非歸一化路徑(一個組件,例如..和.)的歸一化的全路徑,直接作為字串,是使用Convert-Path小命令:
Convert-Path -LiteralPath "C:\Folder\..\Folder2"
在您的命令的背景關系中(請注意,Add-Content 附加到預先存在的目標檔案;要僅寫入給定的內容,請使用Set-Content):
Add-Content "d:\textfile.txt" (Convert-Path -LiteralPath "C:\Folder\..\Folder2")
筆記:
與 不同
Resolve-Path,Convert-Path回傳檔案系統本機路徑,這通常更可取。- 這意味著基于PowerShell 專用驅動器(使用
New-PSDrive)的檔案系統路徑被決議為底層本機檔案系統位置,外部行程也可以理解。(例如,如果MyDrive:映射到C:\Projects,則Convert-Path -LiteralPath MyDrive:\Foo回傳C:\Projects\Foo)
- 這意味著基于PowerShell 專用驅動器(使用
Like
Resolve-Path,Convert-Path要求路徑參考的專案存在- 這是一個不幸的限制,在GitHub 問題 #2993 中討論。
如果輸入路徑指向不存在的檔案或目錄:
.NET 提供了該[System.IO.Path]::GetFullPath()方法,該方法也為不存在的路徑提供了相同的功能。
挑戰在于相對路徑被決議為.NET的當前(作業)目錄,該目錄通常與 PowerShell 不同- 請參閱此答案以獲取更多資訊。
在PowerShell中(核心)7 ,您可以通過指定參考路徑解決此問題(解決對相對路徑)明確:
# Note: The 'System.' prefix in the type literal is optional.
[IO.Path]::GetFullPath("C:\Folder\..\Folder2", $PWD.ProviderPath)
該自動$PWD變數是指PowerShell的當前位置(目錄)。請注意使用.ProviderPath,它再次確保使用檔案系統本機路徑。為了獲得最大的穩健性 - 防止當前 PowerShell 位置不是檔案系統位置的情況 - 使用(Get-Location -PSProvider FileSystem).ProviderPath.
在Windows PowerShell 中,此方法多載不可用,因此需要更麻煩的方法,如Theo所建議的:
[IO.Path]::GetFullPath(
[IO.Path]::Combine($PWD.ProviderPath, "C:\Folder\..\Folder2")
)
[IO.Path]::Combine()如果后者是相對的,則有條件地將給定的第一個路徑與第二個路徑組合在一起- 否則,按原樣使用后者。[IO.Path]::GetFullPath()然后確保生成的完整路徑的規范化(以解決任何.和..組件)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/385551.html
標籤:电源外壳
