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:
@@ -49,6 +49,8 @@ The script auto-searches these locations in order:
|
|||||||
| `-LocalRenameReplacement` | No | — | Replacement string for `-LocalRenamePattern` (supports capture groups like `$1`) |
|
| `-LocalRenameReplacement` | No | — | Replacement string for `-LocalRenamePattern` (supports capture groups like `$1`) |
|
||||||
| `-Recurse` | No | `false` | Scan subdirectories |
|
| `-Recurse` | No | `false` | Scan subdirectories |
|
||||||
| `-DeleteAfterTransfer` | No | `false` | Delete local files after successful upload. Cannot combine with `-ArchivePath` |
|
| `-DeleteAfterTransfer` | No | `false` | Delete local files after successful upload. Cannot combine with `-ArchivePath` |
|
||||||
|
| `-AppendDate` | No | `false` | Append today's date to the remote filename before the extension (e.g. `export.txt` → `export_20260423.txt`) |
|
||||||
|
| `-DateFormat` | No | `yyyyMMdd` | Date format string used with `-AppendDate`. Any valid `Get-Date` format accepted |
|
||||||
| `-DryRun` | No | `false` | Preview transfers without uploading |
|
| `-DryRun` | No | `false` | Preview transfers without uploading |
|
||||||
| `-LogFile` | No | — | Path to log file (logs to console if omitted) |
|
| `-LogFile` | No | — | Path to log file (logs to console if omitted) |
|
||||||
| `-WinScpDllPath` | No | — | Explicit path to `WinSCPnet.dll` |
|
| `-WinScpDllPath` | No | — | Explicit path to `WinSCPnet.dll` |
|
||||||
@@ -158,6 +160,30 @@ After a successful upload you can archive or rename the local source file. These
|
|||||||
|
|
||||||
> `-LocalRenamePattern`/`-LocalRenameReplacement` only rename the local file — the remote name is controlled by `-RenamePattern`/`-RenameReplacement`. You can use both together.
|
> `-LocalRenamePattern`/`-LocalRenameReplacement` only rename the local file — the remote name is controlled by `-RenamePattern`/`-RenameReplacement`. You can use both together.
|
||||||
|
|
||||||
|
## Appending the Date to Filenames
|
||||||
|
|
||||||
|
Use `-AppendDate` to automatically insert today's date before the file extension on the remote side. The local file is not modified.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Upload every export.txt in all 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
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: `export.txt` → `export_20260423.txt`
|
||||||
|
|
||||||
|
Use `-DateFormat` to change the format:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Use dashes instead: export_2026-04-23.txt
|
||||||
|
.\Send-FilesToSftp.ps1 -LocalPath "C:\jobs" -RemotePath "/incoming" `
|
||||||
|
-HostName "sftp.example.com" -UserName "uploader" `
|
||||||
|
-FileFilter '^export\.txt$' -Recurse -AppendDate -DateFormat 'yyyy-MM-dd'
|
||||||
|
```
|
||||||
|
|
||||||
|
`-AppendDate` applies after `-RenamePattern` if both are used, and works with `-DryRun` so you can preview the result first.
|
||||||
|
|
||||||
## Renaming Files on the Remote Side
|
## Renaming Files on the Remote Side
|
||||||
|
|
||||||
Use `-RenamePattern` (regex) and `-RenameReplacement` together to rename files on the remote side without touching the local files.
|
Use `-RenamePattern` (regex) and `-RenameReplacement` together to rename files on the remote side without touching the local files.
|
||||||
|
|||||||
+29
-2
@@ -75,6 +75,14 @@
|
|||||||
.PARAMETER LogFile
|
.PARAMETER LogFile
|
||||||
Path to a log file. If omitted, logs to console only.
|
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
|
.PARAMETER WinScpDllPath
|
||||||
Path to WinSCPnet.dll. Default: looks in script directory, then common install paths.
|
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" `
|
.\Send-FilesToSftp.ps1 -LocalPath "C:\data" -RemotePath "/archive" `
|
||||||
-HostName "sftp.example.com" -UserName "svcaccount" `
|
-HostName "sftp.example.com" -UserName "svcaccount" `
|
||||||
-KeyFilePath "C:\keys\id_rsa.ppk" -Recurse
|
-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)]
|
[CmdletBinding(SupportsShouldProcess)]
|
||||||
@@ -174,6 +188,10 @@ param(
|
|||||||
|
|
||||||
[switch]$DeleteAfterTransfer,
|
[switch]$DeleteAfterTransfer,
|
||||||
|
|
||||||
|
[switch]$AppendDate,
|
||||||
|
|
||||||
|
[string]$DateFormat = 'yyyyMMdd',
|
||||||
|
|
||||||
[switch]$DryRun,
|
[switch]$DryRun,
|
||||||
|
|
||||||
[string]$LogFile,
|
[string]$LogFile,
|
||||||
@@ -260,6 +278,7 @@ try {
|
|||||||
Write-Log "Host : ${HostName}:${Port}"
|
Write-Log "Host : ${HostName}:${Port}"
|
||||||
if ($RenamePattern) { Write-Log "Remote rename : '$RenamePattern' → '$RenameReplacement'" }
|
if ($RenamePattern) { Write-Log "Remote rename : '$RenamePattern' → '$RenameReplacement'" }
|
||||||
if ($LocalRenamePattern) { Write-Log "Local rename : '$LocalRenamePattern' → '$LocalRenameReplacement'" }
|
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 ($ArchivePath) { Write-Log "Archive to : $ArchivePath" }
|
||||||
if ($DryRun) { Write-Log "*** DRY RUN MODE - No files will be transferred ***" -Level WARN }
|
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
|
Write-Log "Files that would be transferred:" -Level INFO
|
||||||
foreach ($f in $allFiles) {
|
foreach ($f in $allFiles) {
|
||||||
$destName = if ($RenamePattern) { $f.Name -replace $RenamePattern, $RenameReplacement } else { $f.Name }
|
$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 }
|
$localFinalName = if ($LocalRenamePattern) { $f.Name -replace $LocalRenamePattern, $LocalRenameReplacement } else { $f.Name }
|
||||||
$remoteDir = $RemotePath.TrimEnd('/') + ($f.DirectoryName.Substring($LocalPath.TrimEnd('\').Length) -replace '\\', '/')
|
$remoteDir = $RemotePath.TrimEnd('/') + ($f.DirectoryName.Substring($LocalPath.TrimEnd('\').Length) -replace '\\', '/')
|
||||||
$remoteDest = "$remoteDir/$destName"
|
$remoteDest = "$remoteDir/$destName"
|
||||||
$sizeKB = [math]::Round($f.Length / 1KB, 1)
|
$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"
|
Write-Log " UPLOAD : $($f.FullName) → $remoteDest (${sizeKB} KB)$remoteRenameNote"
|
||||||
|
|
||||||
if ($DeleteAfterTransfer) {
|
if ($DeleteAfterTransfer) {
|
||||||
@@ -398,10 +421,14 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$destName = if ($RenamePattern) { $file.Name -replace $RenamePattern, $RenameReplacement } else { $file.Name }
|
$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
|
$targetDir = $RemotePath.TrimEnd('/') + $relativePath
|
||||||
$targetPath = "$targetDir/$destName"
|
$targetPath = "$targetDir/$destName"
|
||||||
|
|
||||||
if ($RenamePattern -and $destName -ne $file.Name) {
|
if ($destName -ne $file.Name) {
|
||||||
Write-Log "Renaming: $($file.Name) → $destName"
|
Write-Log "Renaming: $($file.Name) → $destName"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user