【问题标题】:Test-Path -isValid with wildcards带有通配符的测试路径 -isValid
【发布时间】:2016-05-04 07:50:20
【问题描述】:

我正在尝试验证路径,以便提供有意义的错误日志记录,但我遇到了通配符问题。 这将返回 False,除非其中有文件夹和内容,但它应该返回 True。

Test-Path -isValid -path:"C:\Somefolder\*"

这样不起作用,因为 -literalPath 不解释通配符。

Test-Path -isValid -literalPath:"C:\Somefolder\*"

我的感觉是我将不得不测试通配符,如果在父文件夹上找到Test-Path -isValid。但是后来我遇到了-like 的问题,因为我无法真正测试像 *.EXT 这样的条件。这让我认为唯一真正的答案是正则表达式,但这感觉像是非常基本的东西,我真的不需要求助于正则表达式,而且我可能遗漏了一些东西。 请注意,由于各种原因,我仅限于 PS v2。

编辑:为了澄清,实际路径是可变的。用户在 XML 文件中提供路径,然后我验证路径并对其进行处理。因此,可能是用户想要删除某个路径中的所有 TXT 文件。或所有文件。甚至所有文件和子文件夹。因此 C:\Somefolder\* 需要得到支持。如果他们有 C:\\Somefolder\* 或 C:Somefolder\* 我想将其标记为无效路径。但是当 Somefolder 不存在时 C:\Somefolder\* 不是无效路径,它是一个丢失的文件夹,我想将其标记为另一个错误。

【问题讨论】:

  • 你要测试什么路径? Test-Path "C:\Somefolder"够好吗?

标签: powershell powershell-2.0


【解决方案1】:

确实,您需要一个正则表达式来验证路径规范。像这样的东西应该可以工作:

$re = '^[a-z]:[/\\][^{0}]*$' -f [regex]::Escape(([IO.Path]::InvalidPathChars -join ''))
'C:\something\*' -match $re   # returns $true

该表达式将匹配任何以字母开头、后跟冒号、正斜杠或反斜杠以及任意数量的有效路径字符的字符串。

请注意,连续的路径分隔符在路径中是有效的,因此 C:\\something\* -match $re 也将评估为 $true,因为它应该。

如果您想验证实际(现有)路径而不是路径规范,您可以使用Get-ChildItem:

function Test-WildcardPath($Path) {
  Get-ChildItem $Path -ErrorAction SilentlyContinue >$null
  return $?
}

同样,C:\\something\* 将评估为 $true,因为路径中允许连续的路径分隔符。

【讨论】:

    【解决方案2】:

    你可以这样试试吗:

    Test-Path -IsValid C:\Somefolder
    

    编辑:那你为什么不把通配符留给测试路径呢?

    $test.Substring(0,($test.length-($test.Split("\")[-1]).length-1))
    

    【讨论】:

    • 米兰和安德烈,请参阅修订后的 OP。在这种情况下,我必须支持通配符,因此 C:\Somefolder 不是一个选项。正如我所说,我怀疑我最终会完全测试这个,因为我必须测试有效的通配符,当我找到它们时,我会在父文件夹上测试路径。在这方面,我认为我可以将 -like 与转义的通配符一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多