我需要将相对路径作为绝对路径存储在文件中。我已经尝试了很多方法,包括:
$path = (resolve-path -path "C:\Folder\..\Folder2").Path.ToString() Add-content "d:\textfile.txt" $path
剩下一个空文件。所以我被难住了。
yfwxisqw1#
..
.
Convert-Path
Convert-Path -LiteralPath "C:\Folder\..\Folder2"
在命令的上下文中(请注意,Add-Content * 将 * 附加到预先存在的目标文件;要仅写入给定内容,请使用Set-Content):
Add-Content
Set-Content
Add-Content "d:\textfile.txt" (Convert-Path -LiteralPath "C:\Folder\..\Folder2")
注意事项:
Resolve-Path
New-PSDrive
MyDrive:
C:\Projects
Convert-Path -LiteralPath MyDrive:\Foo
C:\Projects\Foo
.NET提供了[System.IO.Path]::GetFullPath()方法,该方法也为 * 不存在的 * 路径提供了相同的功能。挑战在于相对路径被解析为 .NET 的当前(工作)目录,* 该目录通常与PowerShell的目录不同 * -请参阅this answer了解更多信息。在***PowerShell(Core)7+***中,您可以通过 * 显式 * 指定引用路径(解析相对路径时所依据的路径)来解决此问题:
[System.IO.Path]::GetFullPath()
# 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所建议:
$PWD
.ProviderPath
(Get-Location -PSProvider FileSystem).ProviderPath
# 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()
dced5bon2#
如果您的路径还不存在,我发现以下两种方法都可以成功工作:
[IO.Path]::GetFullPath(".\abc") $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\abc.txt")
2条答案
按热度按时间yfwxisqw1#
..
和.
等组件的路径)解析为 * 规范化完整路径*(直接作为 * 字符串 *)的最简单方法是使用Convert-Path
cmdlet:在命令的上下文中(请注意,
Add-Content
* 将 * 附加到预先存在的目标文件;要仅写入给定内容,请使用Set-Content
):注意事项:
Resolve-Path
不同,Convert-Path
返回一个 * 文件系统本机 * 路径,这通常是更可取的。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+***中,您可以通过 * 显式 * 指定引用路径(解析相对路径时所依据的路径)来解决此问题:
自动
$PWD
变量引用PowerShell的当前位置(目录)。请注意.ProviderPath
的使用,它同样确保使用 file-system-native 路径。为了最大限度地提高可靠性(以防止当前PowerShell位置不是 file-system 位置),请使用(Get-Location -PSProvider FileSystem).ProviderPath
。在***Windows PowerShell***中,此方法重载不可用,因此需要一种更麻烦的方法,如Theo所建议:
[IO.Path]::Combine()
* 有条件地 * 将给定的第一条路径与第二条路径组合,* 如果 * 后者是 * 相对的 * -否则,后者按原样使用。[IO.Path]::GetFullPath()
然后确保得到的完整路径的 * 规范化 *(以解析任何.
和..
分量);如果不需要,只需调用[IO.Path]::Combine()
即可。dced5bon2#
如果您的路径还不存在,我发现以下两种方法都可以成功工作: