【问题标题】:Path and string chopping in PowershellPowershell 中的路径和字符串截断
【发布时间】:2011-06-23 18:01:19
【问题描述】:

我正在做一些涉及自动文件移动的工作,这些文件包含必须维护的相对路径。不幸的是,我发现 System.IO.Path、System.String 和 Powershell 的操作员提供的设施有点缺乏优雅地处理我的工作的能力。

对我来说非常有用的一个功能是路径减法的概念,它在理论上可以像减法向量一样工作。从概念上讲,A - B 为您提供了从 B 到 A 的路径。在应用程序到路径中,D:\A\B\C\D - D:\A\B\ = \C\D。同样,D:\A\B\ - D:\A\B\C\D = \..\.. 在这种情况下。我现在可以接受,只有当一条路径完全包含在另一条路径中时,这才有意义。

这似乎包括两个步骤:1) 确定一条路径包含在另一条路径中。 2)从包含路径中删除包含路径。 3) 或者,根据操作的侧向性,将文件夹名称替换为父 .. 符号。

因为我关心的是 NTFS,所以我需要包含和替换操作都是不区分大小写的。对于遏制,我可以使用选择字符串,因为它不区分大小写,并允许使用 -simple 开关,它允许我使用路径而无需将其分开来为正则表达式转义它们。

不过,从另一个字符串中删除字符串有点烦人。 System.IO.Path 对此无能为力,System.String 的相关方法都是区分大小写的,powershell 的运算符都需要按摩,以便正则表达式匹配。

所有这一切似乎比它应该做的更多——我缺少什么工具可以更好地处理这个问题吗?

【问题讨论】:

    标签: regex string powershell path case-sensitive


    【解决方案1】:
    1. 确定包含 - 将您的路径转换为绝对路径(如果还没有的话)。您可以为此使用 Resolve-Path。然后你可以使用 $path1.StartsWith($path2, 'OrdinalIgnoreCase') 来测试遏制。

    2. 删除包含的路径 - $path1.Substring($path2.length)

    3. 将父文件夹名称替换为 ... - 虽然我没有想到正则表达式,但我很确定您可以使用 PowerShell 的 -replace 通过正则表达式搜索/替换来做到这一点运营商

    【讨论】:

    • 在写完这篇文章后,我最终自己使用 Substring 进行减法,但令我惊讶的是,我隐藏了 Resolve-Path cmdlet,我自己的函数只是检查 Path.IsPathRooted 和有条件地调用 Path.Combine。很高兴知道那里已经有一个了!
    • 在对此 Resolve-Path 进行了一些调查之后,它似乎有一个 -relative 开关,这几乎正是我试图实现的,除了它似乎采取了一个不必要的步骤。例如。如果你在目录 Main\ 然后 Resolve-Path 。 -relative 结果在 ..\Main 由于某种原因。非常奇怪,但可能是无害的。 Resolve-Path \ -relative 正确执行,不会试图走出世界的边缘。
    • 在进一步使用时,Resolve-Path 非常讨厌验证它解析的路径是否确实存在;我认为这违反了 SRP,因为我们已经有 Test-Path 可以做到这一点。至少让路径验证默认不开启,如果连那个都没有,那么请至少切换一下!我想要的只是一个函数,当给定 D:\folder 和 ..\file.txt 时,无论它是否存在,都返回 D:\file.txt。
    • 好吧,我不相信这个函数不存在,我又把 System.IO.Path 上的函数倒过来了,显然我希望从 Resolve-Path 中得到的函数存在于 System.IO.Path 中。 IO.Path.GetFullPath。完全不是我所期望的具有该名称的函数。
    【解决方案2】:

    filedirectorypath,在 CodePlex 上,可能会提供您需要的东西

    它不是特定于 PowerShell 的 API,但没有理由不在 PowerShell 中使用它。

    NDepend.Helpers.FilePathDirectory 相对于 .NET Framework 类 System.IO.Path 的优势包括:

    • 强类型文件/目录路径。
    • 相对/绝对路径转换。
    • 路径规范化 API
    • 路径有效性检查 API
    • 路径比较 API
    • 路径浏览 API。
    • 路径变基 API
    • 路径操作列表(TryGetCommonRootDirectory、GetListOfUniqueDirsAndUniqueFileNames、列表相等...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 2011-01-20
      • 2017-10-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多