Test-Path -isValid with wildcards

时间:2016-05-04 07:50:21

标签: powershell powershell-v2.0

我正在尝试验证路径,以便我可以提供有意义的错误记录,并且我遇到了通配符的问题。 除非文件夹中有文件夹,否则返回False,但它应返回True。

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

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

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

我的感觉是,我将不得不测试通配符,如果在父文件夹中找到Test-Path -isValid。但后来我遇到-like的问题,因为我无法真正测试像* .EXT这样的条件。我认为唯一真正的答案是RegEx,但这感觉就像基本的东西我不应该真正需要诉诸RegEx而我可能会遗漏一些东西。 请注意,出于各种原因,我仅限于PS v2。

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

2 个答案:

答案 0 :(得分:2)

实际上,您需要一个正则表达式来验证路径规范。这样的事情应该有效:

$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,因为路径中允许使用连续的路径分隔符。

答案 1 :(得分:0)

你可以尝试这样:

Test-Path -IsValid C:\Somefolder

编辑:那你为什么不把野外考试留给考试路径呢?

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