【问题标题】:Subpath without leading '.'没有前导 '.' 的子路径
【发布时间】:2018-10-16 03:08:19
【问题描述】:

我正在尝试为我当前位置下的所有目录生成不带前导“./”的子路径的限定名称:

$dirs = Get-ChildItem -Directory -Recurse .

我会使用Resolve-Path -Relative,但下一个我需要结果的地方是没有./ 的字符串。

不诉诸字符串操作的恶作剧(我可以 - 分割每条路径,切掉第一个元素,然后再将它加入 - 路径,但是哇!)

注意:我正在使用这个跨平台,所以任何解决方案都需要在核心下工作。

---- 编辑:示例----

Linux:

> cd /proc/sys
> Function GetIPV6 { gci -r -dir |? name -eq 'ipv6' }
> GetIPV6 | Resolve-Path -Relative
./net/ipv6    # << has a leading './' I want to avoid
> (GetIPV6).FullName
/proc/sys/net/ipv6   # << full path, not sub path

我正在寻找的是:

> cd /proc/sys
> GetIPV6 | ???
net/ipv6

窗户:

> cd /windows/system32
> Function GetETC { gci -r -dir |? name -eq "etc" }
> GetETC | resolve-path -relative
.\Drivers\etc  #< has leading .\
> (GetETC).FullName
C:\Windows\System32\Drivers\etc  #< full path

我想要的是

> GetETC | ???
Drivers\etc   or Drivers/etc

【问题讨论】:

  • 添加powershell 标签,因为这不是严格意义上的核心问题。
  • @TheIncorrigible1 除了我只想要一个核心解决方案,所以我将再次删除标签并编辑问题。

标签: powershell-core


【解决方案1】:

如果我将限定路径理解为完全限定路径,则System.IO.DirectoryInfo 对象上有一个FullName 属性,它是从Get-ChildItem -Directory 返回的:

Get-ChildItem -Directory -Recurse |
    Select-Object -ExpandProperty FullName

这为您提供了一个字符串数组,其中包含工作目录下目录的所有完全限定路径。


为了解决您的编辑问题,此示例将在 *nix 或 Windows 上运行:

(Get-ChildItem -Directory -Recurse).
    FullName.
    Replace("$pwd", '') -replace '^[\\/]'

最后是一个更强大的方式:

Get-ChildItem -Directory -Recurse |
    Select-Object -ExpandProperty FullName |
    % Replace "$pwd/", ''

【讨论】:

  • 不幸的是,我正在寻找从Resolve-Path -Relative 获得的sub路径,但没有领先的./。这个答案让我得到了完整的路径。 cd /proc ; gci -R -Dir |? name -eq "ipv6" | select-object -exp fullname => /proc/sys/net/ipv6 cd /proc ; gci -R -Dir |? name -eq "ipv6" | resolve-path -rel => ./sys/net/ipv6 => 不想领先 ./ cd /proc ; gci -R -Dir | ??? => sys/net/ipv6?
  • 那么,您不知道不借助字符串操作的方法吗? (除了最后一次编辑之外的所有问题的规定之一)
  • @kfsone 正确。返回的对象上没有任何属性具有您想要的格式的相关信息。
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2019-03-20
  • 2021-11-29
相关资源
最近更新 更多