我需要将相对路径存储为文件中的绝对路径。我已经尝试了很多事情,包括:
$path = (resolve-path -path "C:\Folder\..\Folder2").Path.ToString()
Add-content "d:\textfile.txt" $path
留下一个空文件。所以我很难过。
最佳答案
解析相对和/或非规范化路径的最简单方法(一个包含诸如..
和 .
) 到一个规范化的完整路径,直接作为一个字符串,是到使用 Convert-Path
cmdlet:
Convert-Path -LiteralPath "C:\Folder\..\Folder2"
在您的命令的上下文中(注意 Add-Content
appends 到预先存在的目标文件;要仅写入给定的内容,请使用 Set-Content
):
Add-Content "d:\textfile.txt" (Convert-Path -LiteralPath "C:\Folder\..\Folder2")
注意:
不同于
Resolve-Path
,Convert-Path
返回一个 file-system-native 路径,这通常是可取的。- 这意味着基于 PowerShell-only 驱动器(使用
New-PSDrive
创建)的文件系统路径被解析为底层本地文件系统位置,正如外部流程所理解的那样。 (例如,如果MyDrive:
映射到C:\Projects
,Convert-Path -LiteralPath MyDrive:\Foo
返回C:\Projects\Foo
)
- 这意味着基于 PowerShell-only 驱动器(使用
与
Resolve-Path
一样,Convert-Path
要求路径所指的项目存在 - 这是一个不幸的限制,在 GitHub issue #2993 中讨论.
如果输入路径指向一个不存在的文件或目录:
.NET 提供 [System.IO.Path]::GetFullPath()
方法,它也为不存在的路径提供相同的功能。
挑战在于相对路径被解析为 .NET 的当前(工作)目录,通常不同于 PowerShell 的 - 参见 this answer获取更多信息。
在 PowerShell (Core) 7+ 中,您可以通过明确地指定引用路径(解析相对路径)来解决此问题 em>:
# Note: The 'System.' prefix in the type literal is optional.
[IO.Path]::GetFullPath("C:\Folder\..\Folder2", $PWD.ProviderPath)
automatic $PWD
variable指 PowerShell 的当前位置(目录)。请注意 .ProviderPath
的使用,它再次确保使用 file-system-native 路径。为了获得最大的稳健性 - 再次防止当前 PowerShell 位置不是文件系统位置的情况 - 使用 (Get-Location -PSProvider FileSystem).ProviderPath
。
在 Windows PowerShell 中,如果此方法重载不可用,则需要更麻烦的方法,如 Theo 所建议的那样:
# Note: If you don't need to *normalize* the path (resolving . and .. components),
# the [IO.Path]::Combine() call alone is enough.
[IO.Path]::GetFullPath(
[IO.Path]::Combine($PWD.ProviderPath, "C:\Folder\..\Folder2")
)
[IO.Path]::Combine()
有条件地将给定的第一个路径与第二个路径结合起来,如果后者是相对的 - 否则,后者按原样使用。[IO.Path]::GetFullPath()
然后确保生成的完整路径的规范化(解析任何。
和..
组件);如果不需要,只需调用[IO.Path]::Combine()
即可。
关于powershell - 将相对路径转换为绝对字符串路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70390985/