如何验证路径字符串?
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?
是否有任何函数可用于验证路径字符串?
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?