Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell: subtract $pwd from $file.Fullname

Given the following files:

c:\dev\deploy\file1.txt
c:\dev\deploy\file2.txt
c:\dev\deploy\file3.txt
c:\dev\deploy\lib\do1.dll
c:\dev\deploy\lib\do2.dll

e.g. if $pwd is the following

c:\dev\deploy

running the statement

$files = get-childitem

I want to take this list and using foreach ($file in $files) I want to substitute my own path for the $pwd e.g. I want to print c:\temp\files like the following:

c:\temp\files\file1.txt
c:\temp\files\file2.txt
c:\temp\files\file3.txt
c:\temp\files\lib\do1.dll
c:\temp\files\lib\do2.dll

How can I peform this i.e.

A = c:\dev\deploy\file1.txt - c:\dev\deploy\
B = c:\temp\files\ + A

giving B = c:\temp\files\file1.txt

?

like image 201
El Toro Bauldo Avatar asked Feb 12 '10 16:02

El Toro Bauldo


2 Answers

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
}
like image 101
stej Avatar answered Oct 15 '22 19:10

stej


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* }
like image 35
Jordij Avatar answered Oct 15 '22 20:10

Jordij