Need help with a simple Powershell copy script

I am running this below script to incrementally copy files that have changed on a weekly basis.

The problem I am coming across is that all of the files being copied are being placed on the root of the DataNew directory, and are not getting placed in proper subfolders that exist in the Data folder, even though I am using the recurse tag. Is there something that I maybe need to do with paths?

Here is the script:

foreach ($i in Get-ChildItem C:\Data -recurse)
{
    if ($i.LastWriteTime -lt ($(Get-Date).AddDays(-7)))
    {
        Copy-Item $i.FullName C:\DataNew
    }
}

Open in new window



Thanks

Parts of the script borrowed from Technet.
SchneiderDownsSenior Technical ManagerAsked:
Who is Participating?
 
soostibiConnect With a Mentor Commented:
Sorry, this is my test directories, here is the same with your paths.
Get-childItem c:\data\ -Recurse | ?{$_.lastwritetime -lt ((Get-Date).adddays(-7))} | 
	%{
		$targetfile = $_.fullname -replace "c:\\data\\", "c:\datanew\"
		if(!(test-path $targetfile))
		{
			$targetpath = (Split-Path -Parent -Path $_.fullname) -replace "c:\\data\\?", "c:\datanew\"
			if(!(test-path $targetpath)){	
				[void] (New-Item -ItemType directory -Name (split-path $targetpath -leaf) -Path (Split-Path $targetpath -parent))
			}
			$_ | Copy-Item -Destination $targetpath
		}
		elseif($_.lastwritetime -gt (get-item $targetfile).lastwritetime)
		{
			Write-Host "$_ $($_.lastwritetime) -gt $((get-item $targetfile).lastwritetime)"
			Copy-Item -Destination $targetfile -Path $_.fullname
		}
	}

Open in new window

0
 
trythisoneCommented:
Try this:
foreach ($i in Get-ChildItem H:\Tools -recurse)
{
   if ($i.LastWriteTime -lt ($(Get-Date).AddDays(-7)))  
  {
     Copy-Item $i.FullName (join-path -path 'H:\DataNew' -childpath $i.FullName.SubString($pwd.path.length))
  }
}

Open in new window

0
 
trythisoneCommented:
Sorry had my test directories in there.. try this one instead
foreach ($i in Get-ChildItem C:\Data -recurse)
{
   if ($i.LastWriteTime -lt ($(Get-Date).AddDays(-7)))  
  {
     Copy-Item $i.FullName (join-path -path 'C:\DataNew' -childpath $i.FullName.SubString($pwd.path.length))
  }
}

Open in new window

0
Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

 
soostibiCommented:
Try this. This copies file in two circumstances: the file is missing from the target or the lastwritetime is greater than the target.
Get-childItem c:\ee\ -Recurse | ?{$_.lastwritetime -lt ((Get-Date).adddays(-7))} | 
	%{
		$targetfile = $_.fullname -replace "c:\\ee\\", "c:\eenew\"
		if(!(test-path $targetfile))
		{
			$targetpath = (Split-Path -Parent -Path $_.fullname) -replace "c:\\ee\\?", "c:\eenew\"
			if(!(test-path $targetpath)){	
				[void] (New-Item -ItemType directory -Name (split-path $targetpath -leaf) -Path (Split-Path $targetpath -parent))
			}
			$_ | Copy-Item -Destination $targetpath
		}
		elseif($_.lastwritetime -gt (get-item $targetfile).lastwritetime)
		{
			Write-Host "$_ $($_.lastwritetime) -gt $((get-item $targetfile).lastwritetime)"
			Copy-Item -Destination $targetfile -Path $_.fullname
		}
	}

Open in new window

0
 
SchneiderDownsSenior Technical ManagerAuthor Commented:
Thanks for the code soostibi, looks like it works good! you wouldn't be able to explain a little how the code works would you?

trythisone, thanks for your code as well, although I was getting a "startIndex cannot be larger than length of string error" when running it.
0
 
soostibiCommented:
By the end of the first line: I select all the files that are modified earlier than 7 days before.
$targetfile : I calculate the new full path of the file
If there is nothing at $targetfile location I calculate the $targetparent, that is the parent folder of the new file. It may happen, that this has not been created, so I create it with the new-item -itemtype directory expression.
After that I copy the file to the new place.

The elseif part checks if the file has been already copied there but it is different than the currently examined file, then it should also copied.
0
All Courses

From novice to tech pro — start learning today.