netnerds.net

24Oct/110

PowerShell: Copy-Item -recurse -force Does Not Create Directories when Using Get-ChildItem -include

I recently wrote a PowerShell script which copied documents from a filter to my local hard drive. I chose PowerShell for this task because it was one of the few programs actually allowed on my ultra locked-down workstation (and 'cuz I love it.)

Because I only wanted specific types of files, I gathered the list of documents using get-childitem -recurse -include and then copied the files using copy-item. What I didn't initially realize was that copy-item's -recurse and -force switches are ineffective in my script because 1.) I'm passing the copy-item command one item at a time and 2.) the get-childitem include switch is "best considered a file filter," according to Lee Holmes of Microsoft's PowerShell team..

I got around this by manually creating the directory structure as needed using if (!(test-path($dir))) { mkdir $dir }. The entire script can be found below:

$source = "L:\"
$destination = "C:\docs\"
$since = (Get-date).AddDays(-365)
$includes ="*.doc*","*.pdf","*.xls*","*.ppt*"

    $items = get-childitem $source -recurse -include $includes |  where-object {$_.LastAccessTime –gt $since}

    foreach ($item in $items)
    {
               $dir = $item.DirectoryName.Replace($source,$destination)
               $target = $item.FullName.Replace($source,$destination)

                if (!(test-path($dir))) { mkdir $dir }

        if (!(test-path($target)))
        {
            copy-item -path $item.FullName -destination $target -recurse -force
        }
    }
Posted by: Chrissy   Filed under: PowerShell Leave a comment
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


No trackbacks yet.