Ho avuto la tua stessa domanda e ho elaborato qualcosa con PowerShell (scripting incorporato di Windows) usando le tecniche del Blog di Scripting Guy qui e qui . Lo script viene eseguito continuamente come processo in background, che è possibile avviare all'accesso del sistema con l'utilità di pianificazione. Lo script verrà avvisato ogni volta che viene inserita una nuova unità e quindi esegue un'operazione (qui si configura lo script anziché l'attività). Dal momento che è sostanzialmente in pausa durante l'attesa per il prossimo disco collegato, non dovresti trovare che occupa molte risorse. Eccomi:
1) Avviare Powershell ISE, che si trova nel menu Start in Accessori / Windows Powershell. 2) Copia incolla quanto segue in 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) È necessario modificare lo script sopra per dire allo script quale unità cercare e cosa eseguire. Le due righe da modificare sono:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Il mio disco rigido USB chiamato 'Mirror' è impostato come Z: drive. Potresti usare solo if ($driveLabel -eq 'MyDiskLabel')
se non ti interessasse la lettera.
start-process "Z:\sync.bat"
Percorso di qualunque compito tu voglia fare. Nel mio esempio, ho creato un file batch sulla mia unità USB che avvia 3-4 righe di comando delle attività di backup.
4) Al termine, salva lo script da qualche parte (estensione .ps1
), quindi crea un'attività in Utilità di pianificazione per eseguire lo script in background. Il mio assomiglia a questo:
- Trigger: all'accesso
- Azione: avviare un programma
- Programma / script: powershell
- Aggiungi argomenti:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Voilà!
6) Materiale extra:
Se vuoi che la finestra dello script sia nascosta, usa questi argomenti:
- Aggiungi argomenti:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Se si desidera generare i messaggi di script in un file di registro (che viene sovrascritto ogni volta che lo script viene avviato, ovvero all'accesso), utilizzare la seguente azione:
- Programma / script: cmd
- Aggiungi argomenti:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
Ogni volta che si desidera terminare l'esecuzione dello script nascosto, è possibile terminare il processo "Powershell" in Task Manager.
L'unico aspetto negativo è che non verrà eseguito nulla all'avvio del computer con l'unità già collegata. (Lo script potrebbe essere modificato per eseguire inizialmente un primo controllo, ma per oggi ne ho abbastanza!)