我希望验证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')
)执行
我想你可以用另一种方式来解决这个问题。
- 使用正则表达式 检查URL格式是否正确
- 解析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,您可以使用它来匹配您的用例。