J'avais la même question que vous et j'ai travaillé sur quelque chose avec PowerShell (scripts intégrés Windows) en utilisant les techniques du Scripting Guy Blog ici et ici . Le script s'exécute en continu en tant que processus d'arrière-plan, que vous pouvez démarrer à l'ouverture de session système avec le planificateur de tâches. Le script sera notifié chaque fois qu'un nouveau lecteur est branché et fera quelque chose (ici vous configurez le script plutôt que la tâche). Comme il est essentiellement suspendu pendant l'attente du prochain lecteur branché, vous ne devriez pas trouver qu'il prend beaucoup de ressources. J'y vais:
1) Démarrez Powershell ISE, qui se trouve dans votre menu Démarrer sous Accessoires / Windows Powershell. 2) Copiez et collez les éléments suivants dans Powershell:
#Requires -version 2.0
Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
write-host (get-date -format s) " Beginning script..."
do{
$newEvent = Wait-Event -SourceIdentifier volumeChange
$eventType = $newEvent.SourceEventArgs.NewEvent.EventType
$eventTypeName = switch($eventType)
{
1 {"Configuration changed"}
2 {"Device arrival"}
3 {"Device removal"}
4 {"docking"}
}
write-host (get-date -format s) " Event detected = " $eventTypeName
if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
write-host (get-date -format s) " Drive name = " $driveLetter
write-host (get-date -format s) " Drive label = " $driveLabel
# Execute process if drive matches specified condition(s)
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
{
write-host (get-date -format s) " Starting task in 3 seconds..."
start-sleep -seconds 3
start-process "Z:\sync.bat"
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange
3) Vous devez modifier le script ci-dessus pour indiquer au script quel lecteur rechercher et quoi exécuter. Les deux lignes à modifier sont:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Mon disque dur USB nommé «Mirror» est défini comme le lecteur Z :. Vous pouvez simplement l'utiliser if ($driveLabel -eq 'MyDiskLabel')
si vous ne vous souciez pas de la lettre.
start-process "Z:\sync.bat"
Chemin de la tâche que vous voulez faire. Dans mon exemple, j'ai créé un fichier de commandes sur ma clé USB qui démarre 3-4 lignes de commande de tâches de sauvegarde.
4) Lorsque vous avez terminé, enregistrez votre script quelque part (extension .ps1
), puis allez créer une tâche dans le Planificateur de tâches pour que votre script s'exécute en arrière-plan. Le mien ressemble à ceci:
- Déclencheur: à la connexion
- Action: démarrer un programme
- Programme / script: PowerShell
- Ajoutez des arguments:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Voilà!
6) Des trucs supplémentaires:
Si vous souhaitez que votre fenêtre de script soit masquée, utilisez ces arguments:
- Ajoutez des arguments:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Si vous souhaitez générer les messages de script dans un fichier journal (qui est écrasé à chaque démarrage du script, c'est-à-dire à la connexion), utilisez l'action de tâche suivante:
- Programme / script: cmd
- Ajouter des arguments:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
Chaque fois que vous souhaitez mettre fin au script masqué en cours d'exécution, vous pouvez terminer le processus "Powershell" dans le Gestionnaire des tâches.
Le seul inconvénient est que rien ne fonctionnera lorsque vous démarrez votre ordinateur avec le lecteur déjà branché. (Le script pourrait être modifié pour effectuer une première vérification au départ, mais j'en ai assez pour aujourd'hui!)