'Apply a file to multiple folders using better PowerShell script

I'm working on a project where I have to apply a file to multiple folders every so often. I'm trying to learn some PowerShell commands to make this a little easier. I came up with the following script, which works, but I feel that this is too verbose and could be distilled down with a better script:

[string]$sourceDirectory  = "C:\Setup\App Folder Files\*"
# Create an array of folders
$destinationDirectories = @(
'C:\Users\GG_RCB1\Documents\',
'C:\Users\GG_RCB2\Documents\',
'C:\Users\LA_RCB1\Documents\',
'C:\Users\PR_RCB1\Documents\',
'C:\Users\PQ_RCB1\Documents\',
'C:\Users\PQ_RCB2\Documents\',
'C:\Users\XC_RCB1\Documents\',
'C:\Users\XC_RCB2\Documents\',
'C:\Users\XC_RCB3\Documents\',
'C:\Users\XC_RCB4\Documents\',
'C:\Users\XC_RCB5\Documents\',
'C:\Users\XC_RCB6\Documents\',
'C:\Users\XC_RCB7\Documents\',
'C:\Users\XC_RCB8\Documents\')
# Perform iteration to create the same file in each folder
foreach ($i in $destinationDirectories) {
    Copy-item -Force -Recurse -Verbose $sourceDirectory -Destination $i
}

I go into this process knowing that every folder in the User folder area is going to have the same format: _RCB<#>\Documents\

I know that I can loop through those files using this code:

Get-ChildItem -Path 'C:\Users'| where-object {$_.Name -match "^[A-Z][A-Z]_RCB"}

What I'm not sure how to do is to how, within that loop, drill down to the Documents folder and do the copy. I want to avoid having to keep updating the array from the first code sample, particularly when I know the naming convention of the subfolders in the Users folder. I'm just looking for a cleaner way to do this.

Thanks for any suggestions!



Solution 1:[1]

Ehh, I'll go ahead and post what I had in mind as well. Not to take away from @Mathias suggestion in the comments, but to offer my solution, here's my take:

Get-ChildItem -Path "C:\users\[A-Z][A-Z]_RCB*\documents" | 
    Copy-Item -Path $sourceDirectory -Destination { $_.FullName } -Recurse -WhatIf

Since everyone loves the "One-Liners" that can accomplish your needs. Get-ChildItem accepts wildcard-expressions in it's path which let's us accomplish this in one go. Given that your directories are...

  1. consistent with the same naming pattern,
    • [A-Z][A-Z]_*
  2. and the folder destination is the same.
    • Documents

Luckily, Copy-Item also has some cool features on it's own such as being able to use a script block that will allow the passing of $_.FullName property as it's destination, while they are passed down the pipeline one at a time.


Remove the -WhatIf common parameter when you've dictated the results are what you're after.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Abraham Zinala