powershell 将相对路径转换为绝对字符串路径

jum4pzuy  于 2022-11-29  发布在  Shell
关注(0)|答案(2)|浏览(231)

我需要将相对路径作为绝对路径存储在文件中。我已经尝试了很多方法,包括:

$path = (resolve-path -path "C:\Folder\..\Folder2").Path.ToString()

Add-content "d:\textfile.txt" $path

剩下一个空文件。所以我被难住了。

yfwxisqw

yfwxisqw1#

  • a将 * 相对 * 和/或 * 非规范化 * 路径**(包含...等组件的路径)解析为 * 规范化完整路径*(直接作为 * 字符串 *)的最简单方法是使用Convert-Path cmdlet
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:Map到C:\Projects,则Convert-Path -LiteralPath MyDrive:\Foo将返回C:\Projects\Foo
  • Resolve-Path一样,Convert-Path要求路径所引用的项 exist-这是一个不幸的限制,在GitHub issue #2993中讨论过。
    如果输入路径指向 * 不存在 * 的文件或目录:

.NET提供了[System.IO.Path]::GetFullPath()方法,该方法也为 * 不存在的 * 路径提供了相同的功能。
挑战在于相对路径被解析为 .NET 的当前(工作)目录,* 该目录通常与PowerShell的目录不同 * -请参阅this answer了解更多信息。
在***PowerShell(Core)7+***中,您可以通过 * 显式 * 指定引用路径(解析相对路径时所依据的路径)来解决此问题:

# Note: The 'System.' prefix in the type literal is optional.
[IO.Path]::GetFullPath("C:\Folder\..\Folder2", $PWD.ProviderPath)

自动$PWD变量引用PowerShell的当前位置(目录)。请注意.ProviderPath的使用,它同样确保使用 file-system-native 路径。为了最大限度地提高可靠性(以防止当前PowerShell位置不是 file-system 位置),请使用(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()即可。
dced5bon

dced5bon2#

如果您的路径还不存在,我发现以下两种方法都可以成功工作:

[IO.Path]::GetFullPath(".\abc")
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\abc.txt")

相关问题