System.IO.Path.Combine rocks for safely combining directory paths, but it’s got a silly inflexibility built in which means you’ve got to clean up paths you first pass in to it.
For example:
Path.Combine(“C:\Foo\”, “\bar”) results in “\bar” because you’ve given Combine “\bar” which is a root-level folder. Unfortunately, there’s no flexible way in the API to deal with this, so you’ve got to do some pre-processing first.
My particular use case right now is that I don’t want any trailing slashes dealt with on the root (left) param, and I don’t care about starting slashes on the subdir (right), so I’m just going to get rid of both those. Ergo:
[char[]]$trimChars = '\\'
function FixTerminatingSlash ($root) {
return $root.TrimEnd($trimChars)
}
function FixStartingSlash($suffix) {
return $suffix.TrimStart($trimChars)
}
function CombinePaths ([string]$root, [string]$subdir) {
$left = FixTerminatingSlash($root)
$right = FixStartingSlash($subdir)
$fullPath = [System.IO.Path]::Combine($left, $right)
return $fullPath
}
Invoke this via “CombinePaths <rootDir> <subDir>” with a space, not a comma, between the two. It’s not rocket science, and I’m sure some PowerShell guru will tell me all this can be done some other way in three characters – which is fine, so show me!
3 comments:
Join-Path "C:\root\" "\subdirectory"
And yes, I went 2 years ignorant of Join-Path (and similarly using a lot of [system.io.path]::Combine()), so you're in good company.
Argh! Thanks for the tip, Peter!
Sure enough, it's right in Windows PowerShell Cookbook, too. I need to get more familiar with my copy of that!
Thanks, Jim.
And while you are talking about join-path, don't forget about the other path manipulation cmdlets - Split-Path, Resolve-Path, and Test-Path.
Post a Comment