如何验证路径字符串?

How to validate a path string?

是否有任何函数可用于验证路径字符串?

https://docs.microsoft.com/en-us/dotnet/api/system.io.path?view=net-5.0 处的 Microsoft 文档说“所有 Path 成员如果检测到无效路径字符,则将路径作为参数抛出 ArgumentException。”

这应该抛出异常吗?

PS C:\src\t> [Io.Path]::GetFullPath('C:\sr<|c\t')
C:\sr<|c\t
PS C:\src\t> dotnet --version
5.0.301
PS C:\src\t> $PSVersionTable.PSVersion.ToString()
7.2.0

方法一:

我们有 ValidateScript 命令来验证 powershell 函数参数内的文件夹路径,如下所示:

function Validate-Path{
   param(
      [parameter(Mandatory)]
      [String]$Path
   )
   if(Test-Path $Path) {Write-Output "Path is valid"}
   else{Write-Output "Path is invalid"}
}

在 PowerShell 中输入此代码并按回车键。 然后键入 Validate-Path -Path <give-your-folder-path> 并按回车键,这将显示有效或无效的路径。

我已执行此操作以验证我在 PowerShell 中的文件夹路径: 看看这张图 (https://i.imgur.com/BHDg1HO.png)

方法二:

我还测试了 zett42 评论,它运行良好:

PS C:\Users\saiha> Test-Path "C:\Users\saiha\Documents"
True
PS C:\Users\saiha> Test-Path "C:\Users\saiha\Docs"
False
PS C:\Users\saiha>

也使用问题中的给定路径使用两种方法测试:

PS C:\Users\saiha> Test-Path "C:\sr<|c\t"
Test-Path : Illegal characters in path.
At line:1 char:1
+ Test-Path "C:\sr<|c\t"
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\sr<|c\t:String) [Test-Path], ArgumentException
    + FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.TestPathCommand

False
PS C:\Users\saiha> Test-Path "C:\src\t"
True
//User-Defined function
PS C:\Users\saiha> function Validate-Path{
>>    param(
>>       [parameter(Mandatory)]
>>       [String]$Path
>>    )
>>    if(Test-Path $Path) {Write-Output "Path is valid"}
>>    else{Write-Output "Path is invalid"}
>> }
PS C:\Users\saiha> Validate-Path -Path C:\src\t
Path is valid
PS C:\Users\saiha> Validate-Path -Path C:\sr<|c\t
c\t : The module 'c' could not be loaded. For more information, run 'Import-Module c'.
At line:1 char:28
+ Validate-Path -Path C:\sr<|c\t
+                            ~~~
    + CategoryInfo          : ObjectNotFound: (c\t:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CouldNotAutoLoadModule

PS C:\Users\saiha>

实用截图: https://i.imgur.com/ahTsSG3.png

如果我理解不同,请纠正我。

在方法 1 中,我创建了一个用户定义的函数并使用它进行了测试,在方法 2 中,Test-Path 是一个本机函数。但是两者都进行相同的检查并给出正确的结果。

自从 PS 5.1 版以来,行为显然发生了巨大变化,您可能不得不依赖自己的测试功能..

也许像

function Test-IsValidPath {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('FullName')]
        [string]$Path,
        [switch]$MustExist
    )
    # test for invalid characters
    if ($Path.IndexOfAny([System.IO.Path]::GetInvalidPathChars()) -ge 0) { return $false }
    # if the path should exist
    if ($MustExist) { return (Test-Path -LiteralPath $Path) }
    $true
}

Test-IsValidPath 'C:\sr<|c\t'  # --> False

当然,您也可以创建会引发异常的东西。为此,请参阅 Which exception should be thrown for an invalid file name?