我正在尝试验证路径,以便我可以提供有意义的错误记录,并且我遇到了通配符的问题。 除非文件夹中有文件夹,否则返回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不存在时不是无效路径,它是一个丢失的文件夹,我想将其标记为不同的错误。
答案 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))