Solved

# Need help with a simple Powershell copy script

Posted on 2010-08-18
398 Views
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
}
}


Thanks

Parts of the script borrowed from Technet.
0
Question by:SchneiderDowns
• 3
• 2

LVL 4

Expert Comment

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))

}

}

0

LVL 4

Expert Comment

ID: 33471090
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))

}

}

0

LVL 13

Expert Comment

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

}

}

0

LVL 13

Accepted Solution

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

}

}

0

Author Closing Comment

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

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

How to sign a powershell script so you can prevent tampering, and only allow users to run authorised Powershell scripts
Synchronize a new Active Directory domain with an existing Office 365 tenant
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.