尝试/捕获非法字符

时间:2017-08-22 17:22:57

标签: powershell error-handling try-catch illegal-characters

问题和细节

我正在处理自定义错误处理,我遇到的一个错误就是“路径中的非法字符”。我有一个自定义函数,用于查看此类非法字符的路径字符串,并在找到它们时抛出自定义错误。但我发现根据非法字符,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之前使用它来捕获问题?

1 个答案:

答案 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

或可能使用constructorPath.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