Home > Software design >  PowerShell - Copy the same file for each correspondence
PowerShell - Copy the same file for each correspondence

Time:12-01

How do I copy a file more than once to a folder using the same line of code?

I have this code here:

$TodayDate = Get-Date -Format "dd-MM-yyyy"
$TodayDateSecs = Get-Date -Format "dd-MM-yyyy I hh-mm-ss"

$Sheet01 = "C:\Users\MyUser\Desktop\Sheets"
$Sheet01exists = get-ChildItem $Sheet01 -recurse | where {$_.name -match "Modelo 01 - $TodayDate"} | select name
$Project01 = "C:\Users\MyUser\Desktop\Project 01\Model 01.txt"
$WatchFolder = "C:\Users\MyUser\Desktop\Watch Folder\$ClientName"
$OldSheets = "C:\Users\MyUser\Desktop\Project 01\Old Sheets"
$MoveSheetAfterRender = get-ChildItem $Sheet01 -recurse | where {$_.name -match "Modelo 01 - $TodayDate"} | Move-Item -Destination $OldSheets

If ($Sheet01exists) {
Copy-Item -Path $Project01 -Destination "$WatchFolder\Model 01 - $TodayDateSecs.txt"
$MoveSheetAfterRender
Write-Host "Copiado para Renderização"
}
Else {
Write-Host "Arquivo não encontrado"
}

My intention is: every time $Sheet01exists returns a match I would like the file specified in $Project01 to be copied to a folder in $WatchFolder.

The problem is that if there is more than one file corresponding to $Sheet01exists the file from $Project01 will only be copied once.

What I need is for the file in $Project01 to be copied to $WatchFolder for each match in $Sheet01exists. That is, it needs to be copied and renamed in order not to be overwritten.

How can I do this as cleanly as possible?

CodePudding user response:

Here's one way to go about it piping directly to a Foreach-Object loop:

$TodayDate = Get-Date -Format "dd-MM-yyyy"
$TodayDateSecs = Get-Date -Format "dd-MM-yyyy I hh-mm-ss"

[ref]$i = 0
$Project01   = "C:\Users\MyUser\Desktop\Project 01\Model 01.txt"
$WatchFolder = "C:\Users\MyUser\Desktop\Watch Folder\$ClientName"
$OldSheets   = "C:\Users\MyUser\Desktop\Project 01\Old Sheets"

$Sheet01 = "C:\Users\MyUser\Desktop\Sheets"
Get-ChildItem -Path $Sheet01 -Filter "*Modelo 01 - $TodayDate*" -Recurse | 
    ForEach-Object -Process `
    {
        Copy-Item -Path $Project01 -Destination {
            '{0}\Model 01 - {1}{2}.txt' -f $WatchFolder, $TodayDateSecs, 
                $(
                    if ($i -ne 0) 
                    {
                        '[{0:D2}]' -f $i
                    }
                    $i  
                )
        } -Verbose -WhatIf
        Move-Item -Path $_.FullName -Destination $OldSheets -WhatIf
    }

Since you're just moving the same files found out of their location onto $OldSheets, you can do it inside the loop by passing it the objects path. As for the files that are to be copied over, since -Destination accepts a scriptblock you can create a string of your own with incrementing $i, then appending it to the end of the path giving you the [01]..[10] effect.


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

  • Related