如何规范化和比较 Powershell 中的路径
How to normalize and compare paths in Powershell
我需要测试两个包含路径的字符串,看它们是否指向同一个目录。
例如,在将 C:\Windows
与 C:\Windows\
进行比较时,简单地使用字符串比较会失败。
根据 Whosebug-Question 使用 Join-Path 可以解决这个问题,但它仍然遗漏了其他问题:
例如 \server\share
有时可以表示为 UNC\server\share
或 \<ip>\share
是否有不使用变通方法来检查此问题的正确方法?
现在我使用这个作为解决方法:
function Format-Path(){
[Cmdletbinding()]
param($Path)
Write-Verbose "Format-Path: $Path"
if($Path.StartsWith(".")){
#Get Absolute path if path starts with "."
$Path = Resolve-Path -Path $Path
Write-Verbose "Resolved Path: $Path"
}
if($Path -match "^.*::(.*)"){
$Path = $Path -replace "^.*::(.*)", ''
Write-Verbose "Replaced Powershell providers: $Path"
}
$Path = $Path -replace "/" , "\" `
-replace "^\\\.\" , "" `
-replace "^\\\?\" , "" `
-replace "^UNC\" , "\"
Write-Verbose "Replaced UNC conventions: $Path"
if($Path -match "^\\([A-Za-z]+)(@SSL)?"){
$Path = $Path -replace "^\\([A-Za-z]+)(@SSL)?", "\$((Resolve-DnsName $matches[1] -Type "A").IPAddress)"
Write-Verbose "Resolve name into IP: $Path"
}
return $Path.TrimEnd("\")
}
我需要测试两个包含路径的字符串,看它们是否指向同一个目录。
例如,在将 C:\Windows
与 C:\Windows\
进行比较时,简单地使用字符串比较会失败。
根据
例如 \server\share
有时可以表示为 UNC\server\share
或 \<ip>\share
是否有不使用变通方法来检查此问题的正确方法?
现在我使用这个作为解决方法:
function Format-Path(){
[Cmdletbinding()]
param($Path)
Write-Verbose "Format-Path: $Path"
if($Path.StartsWith(".")){
#Get Absolute path if path starts with "."
$Path = Resolve-Path -Path $Path
Write-Verbose "Resolved Path: $Path"
}
if($Path -match "^.*::(.*)"){
$Path = $Path -replace "^.*::(.*)", ''
Write-Verbose "Replaced Powershell providers: $Path"
}
$Path = $Path -replace "/" , "\" `
-replace "^\\\.\" , "" `
-replace "^\\\?\" , "" `
-replace "^UNC\" , "\"
Write-Verbose "Replaced UNC conventions: $Path"
if($Path -match "^\\([A-Za-z]+)(@SSL)?"){
$Path = $Path -replace "^\\([A-Za-z]+)(@SSL)?", "\$((Resolve-DnsName $matches[1] -Type "A").IPAddress)"
Write-Verbose "Resolve name into IP: $Path"
}
return $Path.TrimEnd("\")
}