Tenía la misma pregunta que tú, y resolví algo con powershell (scripting integrado de Windows) usando técnicas del Scripting Guy Blog aquí y aquí . El script se ejecuta continuamente como un proceso en segundo plano, que puede comenzar en el inicio de sesión del sistema con el programador de tareas. El script será notificado cada vez que se conecte una nueva unidad y luego haga algo (aquí configura el script en lugar de la tarea). Dado que está básicamente en pausa mientras espera la próxima unidad conectada, no debería encontrar que ocupa muchos recursos. Aquí voy:
1) Inicie Powershell ISE, que se puede encontrar en su menú de inicio en Accesorios / Windows Powershell. 2) Copie y pegue lo siguiente en 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) Debe modificar la secuencia de comandos anterior para indicarle qué unidad debe buscar y qué ejecutar. Las dos líneas para cambiar son:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Mi disco duro USB llamado 'Mirror' está configurado como la unidad Z:. Podrías usarlo if ($driveLabel -eq 'MyDiskLabel')
si no te importara la carta.
start-process "Z:\sync.bat"
Ruta de cualquier tarea que desee hacer. En mi ejemplo, he creado un archivo por lotes en mi unidad USB que inicia 3-4 líneas de comando de tareas de copia de seguridad.
4) Cuando haya terminado, guarde su script en algún lugar (extensión .ps1
), luego vaya a crear una tarea en el Programador de tareas para que su script se ejecute en segundo plano. El mío se ve así:
- Activador: al iniciar sesión
- Acción: iniciar un programa
- Programa / script: powershell
- Añadir argumentos:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) ¡Voilà!
6) Cosas extra:
Si desea que su ventana de script esté oculta, use estos argumentos:
- Añadir argumentos:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Si desea enviar los mensajes de script a un archivo de registro (que se sobrescribe cada vez que se inicia el script, es decir, al iniciar sesión), utilice la siguiente acción de tarea:
- Programa / script: cmd
- Agregar argumentos:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
Cada vez que desee finalizar el script oculto en ejecución, puede finalizar el proceso "Powershell" en el Administrador de tareas.
El único inconveniente es que no se ejecutará nada cuando inicie su computadora con la unidad ya conectada.