将什么附加到路径以使其指向文件系统根目录?

What to append to a path to make it point to the file system root?

我有一些路径,比方说C:\Windows\System32\WindowsPowerShell\。我想找到这样一个字符串,当附加(从右侧)时,将使该路径指向 C:\.

嗯,设置好路径就好办了;我可以做到 C:\Windows\System32\WindowsPowerShell\..\..\..\.

然而,我正在寻找的是一个 固定字符串 ,无论初始路径看起来如何(尤其是它有多长),它每次都能正常工作。 Windows 是否提供了一些技巧来帮助解决这个问题?如果无法实现,则为有效答案。

奖励积分:我可以这样引用不同的硬盘吗?

使用 Convert-Path 到 resolve/consolidate 给定路径,然后继续添加 .. 直到到达卷的根目录:

# Grab current location from `$pwd` automatic variable
$path = "$pwd"

# Calculate path root 
$root = [System.IO.Path]::GetPathRoot($path)

while((Convert-Path $path) -ne $root){
  # We haven't reached the root yet, keep backing up
  $path = Join-Path $path '..'
}

$path 现在包含 C:\Current\Relative\Path\..\..\..,您现在可以:

& path\to\myBinary.exe (Join-Path $path.Replace("$pwd","").TrimStart('\') targetfile.ext)

$path.Replace("$pwd", "") 只给我们 \..\..\..,而 TrimStart('\') 删除了前导路径分隔符以使路径成为相对路径,因此传递给二进制文件的结果字符串将是 ..\..\..\targetfile.ext

固定 字符串不是一个选项,但很容易动态 为任意长度的给定路径构造一个字符串。

利用 * 这一事实,当应用于 LHS 上的 string 时,会将该字符串复制给定的次数(例如,'x' * 3 产量 xxx):

# Sample input path.
$path = 'C:\Windows\System32\WindowsPowerShell'

# Concatenate as many '..\' instances as there are components in the path.
$relativePathToRoot = '..\' * $path.Split('\').Count
$absolutePathToRoot = Join-Path $path $relativePathToRoot

# Sample output
[pscustomobject] @{
  RelativePathToRoot = $relativePathToRoot
  AbsolutePathToRoot = $absolutePathToRoot
}

注意:在 Unix 上,使用 '../' * $path.Split('/').Count;对于 cross-platform 解决方案,请使用 "..$([IO.Path]::DirectorySeparatorChar)" * $path.Split([IO.Path]::DirectorySeparatorChar).Count;对于可以在任一平台上处理任一分隔符的解决方案(并在结果中使用 /),请使用 '../' * ($path -split '[\/]').Count

输出:

RelativePathToRoot AbsolutePathToRoot
------------------ ------------------
..\..\..\..\       C:\Windows\System32\WindowsPowerShell..\..\..\..\

根在 FileInfo 对象中可用。

PS C:\src\t> (Get-ChildItem -Path 'C:\Windows\System32\WindowsPowerShell\').PSDrive.Root
C:\