Here is a parameterized Powershell script to copy the files from one location to multiple destinations. You can also rename the files and use various date formats to put the files in yearly/monthly folder. Once the files are successfully copied, you have an option to delete the file from source location.
Usage
<# Explanation - Source Excel file name contains 4 digit store number (example: "Report_Store_0278.xlsx"). We want to copy those files to "business" folder with only store number (i.e. "0278.xlsx") and also archive the same file in a folder with today's date (i.e. "archive\20180215\0278.xlsx"). Once copied, we want to delete the files from source folder.
#>
CopyFiles.ps1 -SourcePath '\\networklocation\source\' -SourceFilePattern 'Report_Store_\[([0-9]{4})\].*.xlsx' -CopyFiles '\\networklocation\business\${1}.xlsx','\\networklocation\archive\%date{yyyyMMdd}\${1}.xlsx' -DeleteSource 1
Source Code
# Copy the following code into a file called CopyFiles.ps1
param(
[string]$SourcePath = $(throw "SourcePath param required"),
[string]$SourceFilePattern = $(throw "$SourceFilePattern param required"),
[string[]] $CopyFiles = $(throw "CopyFiles param required"),
[int] $DeleteSource = 0
)
<#
$SourceFile = "C:\Temp\Opterus\Source\S([0-9]+).*.xls"
$CopyFiles = @("C:\Temp\Opterus\Destination\*.*", "C:\Temp\Opterus\Archive\%date{yyyyMMdd}\S`${1} Merchandise Report.xls")
$DeleteSource = $true
#>
$DateEvaluator =
{
param($m)
$date = [DateTime]::Now
$date.ToString($m.Groups[1].Value)
}
Write-Host "[Source:]" $SourcePath$SourceFilePattern
Write-Host "[Copy To:]" $CopyFiles
Write-Host "[Delete?:]" $DeleteSource
# replace date token in source path if any
$SourcePath = [Regex]::Replace($SourcePath, '%date{(.+?)}', $DateEvaluator)
$SourceFilePattern = [Regex]::Replace($SourceFilePattern, '%date{(.+?)}', $DateEvaluator)
$matchedFiles = Get-ChildItem -Path $SourcePath | Where-Object {($_.Name -match $SourceFilePattern)}
# Check if the files found
if (($matchedFiles -eq $null) -or ($matchedFiles.Count -eq 0))
{
# Files not found so exit the script
Write-Host "No files found"
Exit
}
foreach($CopyFile in $CopyFiles)
{
$CopyFile = [Regex]::Replace($CopyFile, '%date{(.+?)}', $DateEvaluator)
$DestPath = Split-Path $CopyFile -Parent
$DestFilePattern = Split-Path $CopyFile -Leaf
# Loop through each files
foreach ($file in $matchedFiles) {
$destFileName = ""
if($DestFilePattern -and $DestFilePattern -ne '*.*')
{
$destFileName = $file.Name -ireplace $SourceFilePattern, $DestFilePattern
}
else
{
$destFileName = $file.Name;
}
Write-Host "[Source File] ["$file.FullName"]"
# If the directory does not exists, create one
if ((Test-Path $DestPath) -eq $false)
{
New-Item -ItemType Directory -Force -Path $DestPath
}
# Copy file
Copy-Item -LiteralPath $file.FullName -Destination ($DestPath + "\\" + $destFileName)
Write-Host "[Copy File] ["$DestPath\$destFileName"]"
}
}
if($DeleteSource -eq 1)
{
foreach ($file in $matchedFiles) {
Write-Host "[Delete File] ["$file.FullName"]"
Remove-Item -LiteralPath $file.FullName
}
}
Leave a Reply