Eu tinha a mesma pergunta que você e resolvi algo com o PowerShell (script interno do Windows) usando técnicas do Scripting Guy Blog aqui e aqui . O script é executado continuamente como um processo em segundo plano, que você pode iniciar no logon do sistema com o planejador de tarefas. O script será notificado sempre que uma nova unidade for conectada e, em seguida, faça alguma coisa (aqui você configura o script em vez da tarefa). Como está basicamente em pausa enquanto aguarda a próxima unidade conectada, você não deve encontrar muitos recursos. Aqui vou eu:
1) Inicie o Powershell ISE, que pode ser encontrado no menu Iniciar em Acessórios / Windows Powershell. 2) Copie e cole o seguinte no 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) Você precisa modificar o script acima para informar ao script qual unidade procurar e o que executar. As duas linhas a serem alteradas são:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Meu disco rígido USB chamado 'Mirror' é definido como Z: drive. Você poderia usar if ($driveLabel -eq 'MyDiskLabel')
se não se importasse com a carta.
start-process "Z:\sync.bat"
Caminho de qualquer tarefa que você deseja executar. No meu exemplo, criei um arquivo em lotes na minha unidade USB que inicia de 3 a 4 linhas de comando das tarefas de backup.
4) Quando terminar, salve seu script em algum lugar (extensão .ps1
) e, em seguida, crie uma tarefa no Agendador de Tarefas para que seu script seja executado em segundo plano. O meu fica assim:
- Disparador: no logon
- Ação: iniciar um programa
- Programa / script: powershell
- Adicione argumentos:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Voilà!
6) Coisas extras:
Se você deseja que sua janela de script fique oculta, use estes argumentos:
- Adicione argumentos:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Se você deseja exibir as mensagens de script em um arquivo de log (que é substituído sempre que o script é iniciado, ou seja, no logon), use a seguinte ação da tarefa:
- Programa / script: cmd
- Adicionar argumentos:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
Sempre que você quiser finalizar o script oculto em execução, poderá finalizar o processo "PowerShell" no Gerenciador de Tarefas.
A única desvantagem é que nada será executado quando você inicializar o computador com a unidade já conectada. (O script pode ser alterado para executar uma primeira verificação inicialmente, mas eu já tive o suficiente por hoje!)