Déplacez automatiquement des fichiers d’un serveur SFTP vers un autre répertoire toutes les 15 minutes avec WinSCP et le Planificateur de tâches Windows. Cet article propose un tutoriel pas‑à‑pas, des scripts prêts à l’emploi, des variantes PowerShell et des conseils de dépannage.
Automatiser le déplacement de fichiers avec WinSCP et le Planificateur de tâches Windows
Problématique
Vous devez déplacer (pas copier) à intervalles réguliers les fichiers situés sur le serveur SFTP /mnt/sftp2/packnet
(ou, si la source est exposée aussi en SMB : \\sftp3\sftp\packnet
) vers /root/mercury/packnet
. L’opération doit tourner toutes les 15 minutes via le Planificateur de tâches Windows. La principale difficulté est de bien remplir les champs Program/script et Add arguments lors de la création de l’action.
Solution pas‑à‑pas
Étape | Détails |
---|---|
1. Préparer le script WinSCP | Créez un fichier texte, par exemple C:\Scripts\packnet.txt , contenant :option batch on option confirm off open sftp://USER:PASS@HOST mv /mnt/sftp2/packnet/* /root/mercury/packnet/ exit Remplacez USER /PASS /HOST par vos valeurs. Ajoutez option confirm off pour éviter les confirmations.Astuce : pour ne pas stocker le mot de passe en clair, enregistrez une session dans WinSCP et utilisez open "Nom_de_session" . |
2. Appeler WinSCP directement | Dans le Planificateur de tâches → Nouvelle action : • Program/script : "C:\Program Files (x86)\WinSCP\WinSCP.com" (ou "C:\Program Files\WinSCP\WinSCP.com" selon votre installation)• Add arguments : /script="C:\Scripts\packnet.txt" /log="C:\Logs\packnet.log" • Start in (facultatif) : dossier de WinSCP ou C:\Scripts . |
3. (Alternative) Passer par PowerShell | Créez C:\Scripts\winscp.ps1 :& "C:\Program Files (x86)\WinSCP\WinSCP.com" /script:"C:\Scripts\packnet.txt" /log:"C:\Logs\packnet.log" Puis, dans l’action :• Program/script : powershell.exe • Add arguments : -NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\winscp.ps1" |
4. Programmer la tâche | • Déclencheur : « Tous les jours » → Répéter la tâche toutes les 15 minutes sans date de fin. • Paramètres de sécurité : cocher Exécuter même si l’utilisateur n’est pas connecté, et Exécuter avec les autorisations maximales si nécessaire. • Conditions : désactivez la condition d’alimentation si la machine est un serveur. • Paramètres avancés : Arrêter la tâche si elle s’exécute plus de : 10 minutes (évite les chevauchements). Si la tâche est déjà en cours : Ne pas démarrer une nouvelle instance. |
5. Tester & vérifier | • Lancez la tâche manuellement pour valider. • Consultez C:\Logs\packnet.log en cas d’erreur.• Vérifiez les droits NTFS, les droits réseau (si SMB), et la stratégie d’exécution PowerShell ( Set-ExecutionPolicy ) si vous utilisez l’alternative PowerShell. |
Pourquoi utiliser WinSCP.com
?
WinSCP.com
est la version console (non interactive) de WinSCP. Elle est conçue pour l’automatisation : elle accepte des scripts, renvoie des codes de sortie, et produit des logs. C’est la brique idéale pour le Planificateur de tâches.
Bonnes pratiques de script
- Mode batch : gardez
option batch on
pour que le script échoue nettement en cas de question interactive (mot de passe, écrasement, etc.). - Confirmation :
option confirm off
évite les boîtes de dialogue (— indispensable en tâche planifiée). - Logs : utilisez l’argument global
/log
et, si nécessaire,/loglevel=1
(ou 2 pour un diagnostic approfondi). Exemple :/log="C:\Logs\packnet.log" /loglevel=1
- Chemins avec espaces : entourez systématiquement de guillemets
"..."
. - Session enregistrée : créez une session dans WinSCP et remplacez
open sftp://USER:PASS@HOST
paropen "Session_Packnet"
. Vous évitez ainsi le mot de passe en clair dans le fichier. - Atomicité :
mv
effectue un renommage côté serveur (quand la source et la destination sont sur le même serveur), ce qui est très rapide et évite les copies inutiles.
À propos du filtrage temporel (>15m) et des fichiers partiels
Beaucoup d’équipes souhaitent ignorer les fichiers « trop récents » (encore en cours d’écriture). Deux approches :
- Contrainte d’âge côté transfert : l’option
-filemask
s’applique aux commandes de transfert (get
,put
,synchronize
). Elle n’est pas universellement supportée avecmv
(déplacement serveur→serveur). Si votre flux exige un filtre d’âge tout en restant sur serveur, privilégiez une convention d’extension (p.ex. la source dépose d’abord.tmp
puis renomme en.ready
quand l’écriture est terminée), et déplacez uniquement*.ready
. - Variante PowerShell avancée : utilisez l’API .NET de WinSCP pour lister les fichiers, filtrer par LastWriteTime et invoquer
MoveFile
individuellement. Exemple complet dans la section « Variante PowerShell (avec filtrage d’âge) ».
Raccourci pratique : comme votre tâche s’exécute toutes les 15 minutes, vous pouvez aussi décider de déplacer uniquement les fichiers dont l’horodatage est antérieur au démarrage précédent. La variante .NET ci‑dessous montre comment le faire proprement.
Paramétrage du Planificateur : récapitulatif des champs
Champ | Valeur (exemple) | Commentaires |
---|---|---|
Programme/script | "C:\Program Files (x86)\WinSCP\WinSCP.com" | Utilisez "C:\Program Files\WinSCP\WinSCP.com" si votre installation est 64 bits. |
Arguments | /script="C:\Scripts\packnet.txt" /log="C:\Logs\packnet.log" | Ajoutez /loglevel=1 pour plus de détails en cas de souci. |
Dossier de démarrage | C:\Scripts (facultatif) | Utile si votre script utilise des chemins relatifs. |
Compte d’exécution | Compte de service | Attribuez « Ouvrir une session en tant que tâche ». Évitez les comptes personnels. |
Déclencheur | Quotidien → Répéter toutes les 15 min, indéfini | Désactivez la fin de tâche automatique si votre flux est continu. |
Conflits de planification | Ne pas démarrer une nouvelle instance | Empêche les chevauchements si un run se prolonge. |
Script WinSCP (version sécurisée avec session enregistrée)
Enregistrez d’abord une session nommée Session_Packnet
dans WinSCP (avec authentification par mot de passe ou par clé). Script :
option batch on
option confirm off
open "Session_Packnet"
# Déplace tous les fichiers du dossier source vers la destination
mv /mnt/sftp2/packnet/* /root/mercury/packnet/
exit
Authentification par clé (PPK) : exemple de script
Si vous utilisez une clé privée, il est possible d’ouvrir la session sans mot de passe en clair :
option batch on
option confirm off
# Format : open sftp://HOST/ -username=USER -privatekey="C:\Keys\id_rsa.ppk"
open sftp://HOST/ -username=USER -privatekey="C:\Keys\id_rsa.ppk"
mv /mnt/sftp2/packnet/* /root/mercury/packnet/
exit
Variante PowerShell (appel direct de WinSCP.com)
Créez C:\Scripts\winscp.ps1
:
# Assure un contexte propre
$ErrorActionPreference = 'Stop'
$WinScp = 'C:\Program Files (x86)\WinSCP\WinSCP.com' # ou C:\Program Files\WinSCP\WinSCP.com
$Args = @(
'/script:"C:\Scripts\packnet.txt"',
'/log:"C:\Logs\packnet.log"',
'/loglevel=1'
)
# Exécute WinSCP et renvoie le code de sortie
$proc = Start-Process -FilePath $WinScp -ArgumentList $Args -NoNewWindow -PassThru -Wait
if ($proc.ExitCode -ne 0) {
throw "WinSCP a retourné le code $($proc.ExitCode). Consultez C:\Logs\packnet.log"
}
Variante PowerShell (avec filtrage d’âge via API .NET)
Pour ne déplacer que les fichiers âgés d’au moins 15 minutes tout en restant « serveur→serveur », utilisez l’assemblage .NET de WinSCP. Placez WinSCPnet.dll
dans C:\Scripts
(ou dans un répertoire connu) puis créez C:\Scripts\packnet-aged.ps1
:
#requires -version 5.1
# Chargement de l'API WinSCP
Add-Type -Path "C:\Scripts\WinSCPnet.dll"
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "HOST"
UserName = "USER"
Password = "PASS" # ou utilisez .SshPrivateKeyPath = "C:\Keys\id_rsa.ppk"
# PortNumber = 22
}
$source = "/mnt/sftp2/packnet"
$destination = "/root/mercury/packnet"
$minAge = [TimeSpan]::FromMinutes(15)
$nowUtc = [DateTime]::UtcNow
$session = New-Object WinSCP.Session
try {
$session.Open($sessionOptions)
# Récupère la liste des fichiers réguliers (non dossiers)
$files = $session.EnumerateRemoteFiles($source, "*", [WinSCP.EnumerationOptions]::None) |
Where-Object { -not $_.IsDirectory }
foreach ($f in $files) {
# WinSCP renvoie LastWriteTime en UTC
if ($nowUtc - $f.LastWriteTime -ge $minAge) {
# Déplacement (renommage) côté serveur, atomique et instantané
$session.MoveFile($f.FullName, (Join-Path $destination $f.Name).Replace('','/')) | Out-Null
}
}
}
finally {
$session.Dispose()
}
Dans le Planificateur : Program/script =powershell.exe
, Add arguments =-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\packnet-aged.ps1"
. Cette variante est idéale quand vous voulez un contrôle fin (âge, extensions, taille minimale/maximum, etc.).
Journalisation (logs) et rotation
- Fichier unique :
/log="C:\Logs\packnet.log"
est suffisant au quotidien. - Rotation simple : appelez WinSCP via PowerShell et créez un nom de log daté :
$stamp = Get-Date -Format 'yyyyMMdd_HHmm' $log = "C:\Logs\packnet_$stamp.log" & "C:\Program Files\WinSCP\WinSCP.com" /script:"C:\Scripts\packnet.txt" /log:"$log" /loglevel=1
- Niveau de détail : passez
/loglevel=2
temporairement pour une analyse fine, puis revenez à1
(ou0
).
Utiliser SMB comme source à la place du SFTP
Si la source est partagée en SMB (\\sftp3\sftp\packnet
) et que la destination reste sur le même serveur SFTP, deux cas :
- Déplacement local Windows → SFTP : il ne s’agit plus d’un mv serveur→serveur, mais d’un put (téléversement) puis suppression de la source. Utilisez :
put -delete "\\sftp3\sftp\packnet\*" /root/mercury/packnet/
Avec filtre d’âge :put -delete -filemask=">=15m" "\\sftp3\sftp\packnet\*" /root/mercury/packnet/
- Tout‑SMB : si source et destination sont des partages Windows, WinSCP n’est pas requis (utilisez
Robocopy
ouMove-Item
). Mais dans votre scénario, la destination est Linux (/root/mercury/packnet
), donc WinSCP reste pertinent.
Check‑list de sécurité
- Clés privées : préférez l’authentification par clé (format PPK) à un mot de passe en clair.
- Secrets hors script : utilisez une session enregistrée et
open "Nom_de_session"
. - Droits minimaux : le compte du Planificateur ne doit avoir accès qu’aux dossiers nécessaires.
- Accès réseau : si vous utilisez SMB, évitez les lecteurs mappés ; utilisez des UNC (
\\serveur\partage
) avec des informations d’identification gérées par le compte de la tâche.
Dépannage (FAQ)
Symptôme | Cause probable | Correctif |
---|---|---|
Le script marche en manuel mais pas en tâche | Profils non chargés, variables d’environnement différentes, droits manquants | Dans l’action, utilisez des chemins absolus, cochez « Exécuter avec les autorisations maximales », vérifiez la stratégie -ExecutionPolicy Bypass si PowerShell. |
« Fichier utilisé par un autre processus » | Le fichier est encore en écriture côté source | Mettez en place une convention .ready , ou utilisez la variante .NET avec filtrage d’âge (≥ 15 min). |
Chemins avec espaces non reconnus | Guillemets manquants | Entourez tous les chemins par "..." — y compris dans Add arguments. |
Chevauchement des exécutions | Un run dépasse 15 min | Dans Paramètres, choisissez « Ne pas démarrer une nouvelle instance » et limitez la durée max. |
Logs vides | Répertoire inexistant ou droits insuffisants | Créez C:\Logs et vérifiez les ACL pour le compte de la tâche. |
Erreur d’authentification | Mauvais secret ou host key non approuvée | Testez la connexion dans l’UI WinSCP, enregistrez la session, réutilisez-la dans le script. |
Créer la tâche via la ligne de commande
Vous pouvez créer/mettre à jour la tâche par script (utile en industrialisation) :
schtasks /create /tn "Packnet_Move" /sc minute /mo 15 /tr ^
"\"C:\Program Files\WinSCP\WinSCP.com\" /script:\"C:\Scripts\packnet.txt\" /log:\"C:\Logs\packnet.log\"" ^
/ru "DOMAINE\svc_packer" /rp "LE_MOT_DE_PASSE" /f
Ajoutez ensuite, si nécessaire, Exécuter avec les autorisations maximales via l’UI (ou export/import XML pour peaufiner tous les attributs).
Modèles de scripts prêts à l’emploi
Script minimal (mot de passe en clair – à éviter en prod)
option batch on
option confirm off
open sftp://user:pass@host
mv /mnt/sftp2/packnet/* /root/mercury/packnet/
exit
Script avec session enregistrée
option batch on
option confirm off
open "Session_Packnet"
mv /mnt/sftp2/packnet/* /root/mercury/packnet/
exit
Script « SMB → SFTP » (déplacer en téléversant puis supprimant)
option batch on
option confirm off
open "Session_Packnet"
put -delete "\\sftp3\sftp\packnet\*" /root/mercury/packnet/
exit
Validation : check‑list finale
- La connexion WinSCP en UI fonctionne (session enregistrée si possible).
- Le script
packnet.txt
s’exécute correctement en ligne de commande. - La tâche planifiée est configurée (15 min, exécuter même si non connecté, pas d’instance concurrente).
- Les logs se remplissent et ne dérapent pas en taille (rotation si nécessaire).
- La cible
/root/mercury/packnet
reçoit bien les fichiers, sans partiels.
Informations utiles supplémentaires
- Filtrage temporel : pour un déménagement local↔SFTP, ajoutez
-filemask=>15m
aux commandes de transfert (put
/get
). Pour un mv serveur→serveur, préférez une extension « prête » (.ready
) ou la variante .NET ci‑dessus pour filtrer par âge. - Authentification par clé : remplacez la ligne
open
par :open sftp://HOST/ -username=USER -privatekey="C:\Keys\id_rsa.ppk"
- Sécurité des mots de passe : préférez une session enregistrée dans WinSCP plutôt que d’inscrire le mot de passe en clair, puis utilisez
open "Nom_de_session"
. - Fichiers partiels : évitez de déplacer des fichiers en cours d’écriture : utilisez une convention
.ready
, un filtre d’âge par l’API .NET, ou (pourput
/get
) un-filemask=>1m
combiné àoption transfer binary
etoption confirm off
. - Répétition plus fine : si Windows refuse un intervalle < 5 min, créez plusieurs déclencheurs décalés (ex. 00:00 et 00:07:30) ou utilisez
schtasks /create /sc minute /mo 15 …
en ligne de commande.
Conseils d’exploitation
- Surveillance : exportez les journaux WinSCP dans un répertoire surveillé par votre SIEM ou un job de consolidation.
- Alertes : faites remonter une alerte si le code de sortie ≠ 0 (PowerShell facilite l’intégration avec un e‑mail ou un webhook).
- Capacité : si le volume explose, passez la fréquence à 5 min et limitez l’instance concurrente ; ou segmentez la source par sous‑dossiers (par date).
- Reprise :
mv
est atomique côté serveur. En cas de panne, vous ne perdez pas de données ; la prochaine exécution reprendra là où elle s’est arrêtée.
Exemples de noms et structures de dossiers
Rôle | Exemple | Remarques |
---|---|---|
Scripts | C:\Scripts\ | Contient packnet.txt , winscp.ps1 , etc. |
Logs | C:\Logs\ | Assurez‑vous que le compte de la tâche a l’écriture. |
Clés | C:\Keys\ | Protégez rigoureusement les ACL (lecture seule par le compte de service). |
Source SFTP | /mnt/sftp2/packnet | Vous pouvez subdiviser par date : /mnt/sftp2/packnet/2025-10-11 . |
Destination SFTP | /root/mercury/packnet | Vérifiez l’espace disque et les quotas. |
Conclusion
Avec un script WinSCP minimal, une tâche planifiée soigneusement paramétrée et (si besoin) une variante PowerShell exploitant l’API .NET, vous obtenez un flux robuste et automatisé qui déplace vos fichiers toutes les 15 minutes, sans intervention manuelle, en toute sécurité et avec une observabilité complète.