Add -AppendDate and -DateFormat parameters

Appends today's date to the remote filename before the extension
(e.g. export.txt → export_20260423.txt). Applies after -RenamePattern
if both are used. Works with -DryRun for preview.
This commit is contained in:
blance
2026-04-23 20:44:29 -05:00
parent 8505e75757
commit 32b265876c
2 changed files with 55 additions and 2 deletions
+29 -2
View File
@@ -75,6 +75,14 @@
.PARAMETER LogFile
Path to a log file. If omitted, logs to console only.
.PARAMETER AppendDate
Append the current date to the remote filename before the extension (e.g. export.txt → export_20260423.txt).
Applied after -RenamePattern if both are used. Use -DateFormat to change the date format.
.PARAMETER DateFormat
Date format string used with -AppendDate. Default: 'yyyyMMdd' (e.g. 20260423).
Any valid PowerShell Get-Date format string is accepted (e.g. 'yyyy-MM-dd').
.PARAMETER WinScpDllPath
Path to WinSCPnet.dll. Default: looks in script directory, then common install paths.
@@ -131,6 +139,12 @@
.\Send-FilesToSftp.ps1 -LocalPath "C:\data" -RemotePath "/archive" `
-HostName "sftp.example.com" -UserName "svcaccount" `
-KeyFilePath "C:\keys\id_rsa.ppk" -Recurse
.EXAMPLE
# Upload every export.txt found in subfolders, renamed with today's date
.\Send-FilesToSftp.ps1 -LocalPath "C:\jobs" -RemotePath "/incoming" `
-HostName "sftp.example.com" -UserName "uploader" `
-FileFilter '^export\.txt$' -Recurse -AppendDate
#>
[CmdletBinding(SupportsShouldProcess)]
@@ -174,6 +188,10 @@ param(
[switch]$DeleteAfterTransfer,
[switch]$AppendDate,
[string]$DateFormat = 'yyyyMMdd',
[switch]$DryRun,
[string]$LogFile,
@@ -260,6 +278,7 @@ try {
Write-Log "Host : ${HostName}:${Port}"
if ($RenamePattern) { Write-Log "Remote rename : '$RenamePattern' → '$RenameReplacement'" }
if ($LocalRenamePattern) { Write-Log "Local rename : '$LocalRenamePattern' → '$LocalRenameReplacement'" }
if ($AppendDate) { Write-Log "Append date : enabled (format: $DateFormat)" }
if ($ArchivePath) { Write-Log "Archive to : $ArchivePath" }
if ($DryRun) { Write-Log "*** DRY RUN MODE - No files will be transferred ***" -Level WARN }
@@ -316,11 +335,15 @@ try {
Write-Log "Files that would be transferred:" -Level INFO
foreach ($f in $allFiles) {
$destName = if ($RenamePattern) { $f.Name -replace $RenamePattern, $RenameReplacement } else { $f.Name }
if ($AppendDate) {
$dateStr = Get-Date -Format $DateFormat
$destName = [System.IO.Path]::GetFileNameWithoutExtension($destName) + "_$dateStr" + [System.IO.Path]::GetExtension($destName)
}
$localFinalName = if ($LocalRenamePattern) { $f.Name -replace $LocalRenamePattern, $LocalRenameReplacement } else { $f.Name }
$remoteDir = $RemotePath.TrimEnd('/') + ($f.DirectoryName.Substring($LocalPath.TrimEnd('\').Length) -replace '\\', '/')
$remoteDest = "$remoteDir/$destName"
$sizeKB = [math]::Round($f.Length / 1KB, 1)
$remoteRenameNote = if ($RenamePattern -and $destName -ne $f.Name) { " [remote name: $destName]" } else { '' }
$remoteRenameNote = if ($destName -ne $f.Name) { " [remote name: $destName]" } else { '' }
Write-Log " UPLOAD : $($f.FullName)$remoteDest (${sizeKB} KB)$remoteRenameNote"
if ($DeleteAfterTransfer) {
@@ -398,10 +421,14 @@ try {
}
$destName = if ($RenamePattern) { $file.Name -replace $RenamePattern, $RenameReplacement } else { $file.Name }
if ($AppendDate) {
$dateStr = Get-Date -Format $DateFormat
$destName = [System.IO.Path]::GetFileNameWithoutExtension($destName) + "_$dateStr" + [System.IO.Path]::GetExtension($destName)
}
$targetDir = $RemotePath.TrimEnd('/') + $relativePath
$targetPath = "$targetDir/$destName"
if ($RenamePattern -and $destName -ne $file.Name) {
if ($destName -ne $file.Name) {
Write-Log "Renaming: $($file.Name)$destName"
}