Powershell: subtract $pwd from $file.Fullname Powershell: subtract $pwd from $file.Fullname powershell powershell

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.