Solved

Need help with a simple Powershell copy script

Posted on 2010-08-18
6
400 Views
Last Modified: 2012-05-10
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.
0
Comment
Question by:SchneiderDowns
  • 3
  • 2
6 Comments
 
LVL 4

Expert Comment

by:trythisone
ID: 33471081
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
 
LVL 4

Expert Comment

by:trythisone
ID: 33471090
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
 
LVL 13

Expert Comment

by:soostibi
ID: 33473186
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
Are your AD admin tools letting you down?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

 
LVL 13

Accepted Solution

by:
soostibi earned 500 total points
ID: 33473194
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
 

Author Closing Comment

by:SchneiderDowns
ID: 33474506
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
 
LVL 13

Expert Comment

by:soostibi
ID: 33475149
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

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This script checks a path to see if a folder exists. If the folder does exist you will get output "The folder has previously been created. No action taken" If not it will create the folder. Then adds one user modify permission to the folder. It …
In this previous article (https://oddytee.wordpress.com/2016/05/05/provision-new-office-365-user-and-mailbox-from-exchange-hybrid-via-powershell/), we made basic license assignments to users in O365. When I say basic, the method is the simplest way …
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
Windows 10 is mostly good. However the one thing that annoys me is how many clicks you have to do to dial a VPN connection. You have to go to settings from the start menu, (2 clicks), Network and Internet (1 click), Click VPN (another click) then fi…

815 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now