我正在创建一个函数,我想验证传递给我的函数的字符串是一个格式正确的路径。Test-Path确定路径是否存在,这是我不想要的。是否有一个RegEx表达式可以做到这一点?或者其他本地cmlet ?
谢谢。
您可以使用Test-Path -IsValid
来检查有效但不存在的路径:
Test-Path -LiteralPath 'C:Whatever' -IsValid
问题在于"valid"似乎和"正确格式化"的意思不一样。
例如,如果我使用D:Whatever
,它在我的机器上也是有效的,而E:Whatever
不是;因为没有这样的PSDrive(但C
和D
存在)。
同样奇怪的是,WSman:whatever
是False
而HKCU:whatever
是True
。
它似乎认为UNC路径是有效的。
如果您打算尝试用另一种方式验证路径,您可以从无效字符集开始,您可以通过[System.IO.Path]::InvalidPathChars
获得。
但是这里也有一些奇怪的事情,其中一个字符是§
,然而C:§whatever
从Test-Path -IsValid
返回True
。
我在这里提出的问题可能比答案要多。
从评论:我想验证一个完全合格的路径与驱动器号和可能的目录。C:SomeDirectory或D:blahblah">
我认为这里最直接的事情可能是首先检查路径是否"有根",然后将其转换为[DirectoryInfo]
对象:
if ([System.IO.Path]::IsPathRooted($path)) {
# this will throw an exception if the path can't be used
# for example Z:whatever is accepted, ZZ:whatever is not
$validatedPath = ([System.IO.DirectoryInfo]$path).FullName
}
else {
throw [System.ArgumentException]"Only fully-qualified paths are accepted."
}
你也可以选择保留[DirectoryInfo]
对象而不是"converting">
.FullName
的字符串,因为该对象有许多有用的属性和方法,即使该目录不存在。$path = 'Z:whatever' -as [System.IO.DirectoryInfo]
$path | Format-List *
$path | Get-Member