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

标签 powershell

我需要将相对路径存储为文件中的绝对路径。我已经尝试了很多事情,包括:

$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:\ProjectsConvert-Path -LiteralPath MyDrive:\Foo 返回 C:\Projects\Foo)
  • 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/

相关文章:

powershell - 如何获取PowerShell字符串中最后一次出现char的索引?

powershell - -喜欢多种模式

Powershell Invoke-Command 远程手动工作,但不是来自 Jenkins

windows - PowerShell 命令的程序路径在哪里?

Azure Runbook - 在远程虚拟机上运行 Powershell

powershell - 绕过确认操作对话框

powershell 计算文件夹中的文件并创建带有文件名结果的文本文件

powershell - 仅选择两位小数而不四舍五入

powershell - 如何使用 Powershell 列出域用户的用户权限和组成员资格?

arrays - 比较2个数组并删除元素