'How to normalize and compare paths in Powershell
I need to test two strings, which contain paths, for wether they point to the same directory or not.
Simply using a string comparison fails when comparing C:\Windows
with C:\Windows\
for example.
This problem can be solved by using Join-Path as per this StackOverflow-Question, but it still leaves out other things:
For example \\server\share
can sometimes be represented as UNC\server\share
or \\<ip>\share
Is there a proper way to check this without using a workaround?
Solution 1:[1]
For now I am using this as a workaround:
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 "^.*::(.*)", '$1'
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("\")
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Kevin Holtkamp |