我正在处理自定义错误处理,我遇到的一个错误就是“路径中的非法字符”。我有一个自定义函数,用于查看此类非法字符的路径字符串,并在找到它们时抛出自定义错误。但我发现根据非法字符,Test-Path
cmdlet会首先抛出错误。
我尝试过这样的事情:
try {
Test-Path $path
} catch {
"Custom Message"
}
哪个会做我想做的......但不完全。
function isPathValid {
[CmdletBinding()]
Param(
[Parameter]
[string]$path
)
if (!($path -match "[^a-zA-Z\s]") -OR ($path -match "[^\<\>\*\?\`"\``\`|]") {
throw "customException"
} else {
return $true
}
}
哪个不起作用......但如果我将第二部分改为单独匹配,我可以抓到最多。
是否可以为`&lt;等字符创建-match
检查? &GT; *? | “``?或者有更直观的方法来捕捉这些角色?
假设以上是可能的,有没有办法确保我可以在Test-Path
cmdlet之前使用它来捕获问题?
答案 0 :(得分:2)
您可以使用Test-Path
开关
IsValid
$path = "C:\Path\To\Valid\File.extension"
$isPathValid = Test-Path -Path $path -IsValid # True
$path = "C:\InvalidPath<>"
$isPathValid = Test-Path -Path $path -IsValid # False
$path = "C:\Path?\ValidFileName"
$isPathValid = Test-Path -Path $path -IsValid # False
$path = "C:\InvalidPath\InvalidFileName?"
$isPathValid = Test-Path -Path $path -IsValid # False
或可能使用constructor或Path.GetInvalidPathChars /并入您自己的验证
$path = "C:\Path\To\Valid\File.extension"
$isPathValid = $path.IndexOfAny([System.IO.Path]::GetInvalidPathChars()) -lt 0 # True
$path = "C:\InvalidPath<>"
$isPathValid = $path.IndexOfAny([System.IO.Path]::GetInvalidPathChars()) -lt 0 # False
# Note difference between this return compared to Test-Path above
$path = "C:\Path?\ValidFileName"
$isPathValid = $path.IndexOfAny([System.IO.Path]::GetInvalidPathChars()) -lt 0 # True
$path = "C:\Path?\ValidFileName"
$isPathValid = $path.IndexOfAny([System.IO.Path]::GetInvalidFileNameChars()) -lt 0 # False
$path = "C:\InvalidPath\InvalidFileName?"
$isPathValid = $path.IndexOfAny([System.IO.Path]::GetInvalidFileNameChars()) -lt 0 # False