# encoding: ascii
# api: powershell
# title: Get-ChilditemsRecursive
# description: When you wish to compare to directory trees, you need the relative pathes of the files with respect to root of the directory tree, so that you can match them.
# version: 0.1
# type: function
# author: Bernd Kriszio
# license: CC0
# function: Get-ChildItem2
# x-poshcode-id: 999
# x-archived: 2015-05-11T20:44:11
# x-published: 2009-04-05T02:04:00
#
# This is my private start to work with offline files
# Bernd Kriszio http://pauerschell.blogspot.com/
#
function Get-ChildItem2 ($path)
{
    # path can either be absolut or relative, I only tried filesystem
    # perhaps to named Get-ChildItemsRecursive
    $root = gi $path
    $PathLength = $root.FullName.length
    # it would be nice if Split-Path could do the trick, I didn't grok it 
    gci $path -rec | % {
    Add-Member -InputObject $_ -MemberType NoteProperty -Name RelativePath -Value $_.FullName.substring($PathLength+1)
    $_
    }
}

# Try for example:
# Get-ChildItem2 $pshome | % {$_.RelativePath }
# Now generate demo data

cd f:
md tmp
md tmp\gcir\dir1
md tmp\gcir\dir2
"file1" > tmp\gcir\dir1\file1.txt
"file2" > tmp\gcir\dir1\file2.txt
copy-Item tmp\gcir\dir1\file1.txt tmp\gcir\dir2\file1.txt # both file1 have same length and LastWriteTime 
"file2changed" > tmp\gcir\dir2\file2.txt  # different length forced by different contents

# now we get pathnames relative to the starting path
Get-ChildItem2 tmp | % {$_.RelativePath }
<#
gcir
gcir\dir1
gcir\dir2
gcir\dir1\file1.txt
gcir\dir1\file2.txt
gcir\dir2\file1.txt
gcir\dir2\file2.txt
#>


# and it is easy to compare two trees of files
Compare-Object (Get-ChildItem2 tmp\gcir\dir1) (Get-ChildItem2 tmp\gcir\dir2) -prop RelativePath, LastWriteTime, Length -includeEqual
<#
RelativePath        LastWriteTime                    Length SideIndicator      
------------        -------------                    ------ -------------      
file1.txt           05.04.2009 10:45:03                  16 ==                 
file2.txt           05.04.2009 10:45:03                  30 =>                 
file2.txt           05.04.2009 10:45:03                  16 <=                 
#>

# well we look only for the different files
Compare-Object (Get-ChildItem2 tmp\gcir\dir1) (Get-ChildItem2 tmp\gcir\dir2) -prop RelativePath, LastWriteTime, Length

# add some fiddeling to the newest file only
$last = $null
Compare-Object (Get-ChildItem2 tmp\gcir\dir1) (Get-ChildItem2 tmp\gcir\dir2) -prop RelativePath, LastWriteTime, Length |
Sort RelativePath, LastWriteTime -desc | % {
if ($last -ne $_.RelativePath)
{ $_ }
$last = $_.RelativePath
} | sort RelativePath

<#
RelativePath        LastWriteTime                    Length SideIndicator      
------------        -------------                    ------ -------------      
file2.txt           05.04.2009 10:45:03                  30 =>                 
#>
