将什么附加到路径以使其指向文件系统根目录?
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:\
我有一些路径,比方说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:\