Powershell: subtract $pwd from $file.Fullname
I would use filter here and consider piping the files like this:
filter rebase($from=($pwd.Path), $to) { $_.FullName.Replace($from, $to)}
You can call it like this:
Get-ChildItem C:\dev\deploy | rebase -from C:\dev\deploy -to C:\temp\files\Get-ChildItem | rebase -from (Get-Location).path -to C:\temp\files\Get-ChildItem | rebase -to C:\temp\files\
Note that the replacing is case sensitive.
In case you would need case insensitive replace, regexes would help:(edit based on Keith's comment. Thanks Keith!)
filter cirebase($from=($pwd.Path), $to) { $_.Fullname -replace [regex]::Escape($from), $to}
There's a cmdlet for that, Split-Path, the -leaf option gives you the file name. There's also Join-Path, so you can try something like this:
dir c:\dev\deploy | % {join-path c:\temp\files (split-path $_ -leaf)} | % { *action_to_take* }
How about something like:
function global:RelativePath{ param ( [string]$path = $(throw "Missing: path"), [string]$basepath = $(throw "Missing: base path") ) return [system.io.path]::GetFullPath($path).SubString([system.io.path]::GetFullPath($basepath).Length + 1)} $files = get-childitem Desktop\*.*foreach($f in $files){ $path = join-path "C:\somepath" (RelativePath $f.ToString() $pwd.ToString()) $path | out-host}
I took the simple relative path from here although there is some problems with it, but as you only want to handle paths below your working directory it should be okay.