无效URL vs未找到



我希望验证url类似于可以为文件系统和注册表路径与Test-Path做什么。

但是,当然,Test-Path不能在URL上工作,我一直无法在PowerShell中找到这样做的方法。

我可以使用Invoke-WebRequest,但据我所知,没有验证,如果找到,我可以得到200的返回代码,或者404,如果没有。

唯一的例外是无效的主机名,如host,com,这让我想知道:

  • 除了无效的主机名,还有无效的URL吗?

  • 或者它基本上是任何字符有效的URL路径一旦端口和主机被正确定义?

vonPryz和iRon提供了关键的指针:

您可以使用System.Uri.IsWellFormedUriString方法测试一个URI (URL)是否格式良好的,即形式上有效的(不管域是否存在,是否可达,路径是否存在,…)

要额外确保给定的URI仅限于特定的URI方案,例如http://https://,您可以执行以下操作:

$uri = 'https://example.org/foo?a=b&c=d%20e'
[uri]::IsWellFormedUriString($uri, 'Absolute') -and ([uri] $uri).Scheme -in 'http', 'https'

注意,给定的URI必须已经以转义的形式包含保留字符匀称:为了被认为是匀称的;例如,空格必须编码为%20,就像上面的例子一样,System.Uri.EscapeDataString方法可以对URI的组成部分(非语法)(例如[uri]::EscapeDataString('a b'))执行

我想你可以用另一种方式来解决这个问题。

  1. 使用正则表达式
  2. 检查URL格式是否正确
  3. 解析url后面的IP地址,这将让你知道在这个地址后面是否有什么。

查看下面的示例:

#1 URL format validation
#input the URL here
$urlInput = 'www.google.com'
#This is the regex pattern you can use to validate the format - reference : https://www.regextester.com/94502
$regEx="^(?:http(s)?://)?[w.-]+(?:.[w.-]+)+[w-._~:/?#[]@!$&'()*+,;=.]+$"
if($urlInput -match $regEx){
Write-Host "$urlInput is a Valid URL!"
#2 is there a server behind this url
try{
Resolve-DnsName -Name $urlInput -ErrorAction Stop
}catch{
if($_ -like '*DNS name does not exist*'){
Write-Host "No DNS record for the following URL : $urlInput"
}else{
Write-Output $_
}
}
}
else{
Write-Host "Invalide URL - $urlInput "
}

注:我使用了下面的表达式- https://www.regextester.com/94502,您可以使用它来匹配您的用例。

最新更新