Automatisch programma/script starten bij aansluiten apparaat

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • defusion
  • Registratie: Juli 2003
  • Niet online
Mijn vraag
Ik gebruik een headless systeem (Windows in een VM, met de USB controller in passthrough)
Op dat systeem draait diverse MIDI software voor gebruik met een digitale piano, en dat werkt allemaal prima.
Het probleem is dat als de piano wordt uitgezet en opnieuw aangesloten, of zelfs als ik hem aan laat maar lange tijd niet gebruik, dan werkt de software niet meer, en moet ik handmatig via RDP inloggen op het systeem om de programma's opnieuw op te starten.
Daar zoek ik een oplossing voor


Relevante software en hardware die ik gebruik
Roland FP30, Gigabyte X570 Aurus Pro, Ubuntu 19.10, Qemu/KVM, Windows 10 Pro, Pianoteq, loopMIDI, MIDI-OX

Wat ik al gevonden of geprobeerd heb
Mijn idee was om een batch script te schrijven, dat automatisch alle relevante programma's afsluit en opnieuw opstart zodra USB wordt verbonden.
Dat batchscript heb ik nu, dat werkt, alleen weet ik niet hoe ik het automatisch kan laten opstarten.

Ik zoek dus een manier om zodra de piano (via USB) verbonden wordt, dan dan het script wordt uitgevoerd.

Ik heb wel iets gevonden van USB sticks, en dat het zou kunnen via taakplanner als je een bepaalde event-id hebt, maar ik kan geen event-id vinden bij het aansluiten van de piano.
Iemand bekend met een manier om automatisch een programma te starten zodra een (USB) apparaat wordt aangesloten? Of een andere manier om mijn 'probleem' op te lossen.

Alle reacties


Acties:
  • +1 Henk 'm!

  • defusion
  • Registratie: Juli 2003
  • Niet online
Inmiddels een oplossing gevonden, het volgende powershell script aangepast:
https://superuser.com/que...-connection-of-usb-device

Naar dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#Requires -version 2.0
Register-WmiEvent -Class win32_DeviceChangeEvent -SourceIdentifier deviceChange
write-host (get-date -format s) " Beginning script..."
$lastrun=Get-Date

do{
$newEvent = Wait-Event -SourceIdentifier deviceChange
$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)
{
$currentrun=Get-Date
$timedif=$currentrun-$lastrun
if ($timedif.TotalSeconds -gt 20){
write-host (get-date -format s) "Running task"
start-sleep -seconds 3
start-process "C:\Users\defusion\Desktop\run_piano.bat"
$lastrun=Get-Date
}else{
write-host "Not running task, Timedif: " $timedif.TotalSeconds
}
}

Remove-Event -SourceIdentifier deviceChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier deviceChange


Vooral dus van win32_VolumeChangeEvent naar win32_DeviceChangeEvent
Helaas heeft die class geen mogelijkheid om de apparaatnaam te zien, je ziet alleen dat er een apparaat is gekoppeld, en met bovenstaande script wordt dus met iedere koppeling van een nieuw apparaat de software herstart.
Voldoet voor mij, maar idealiter zou je nog willen filteren zodat het alleen getriggerd wordt bij een specifiek apparaat.

edit: code nog wat verder bijgewerkt, ik dacht dat het feit dat de programma's bij ieder nieuw apparaat opnieuw zouden opstarten geen probleem was, maar kennelijk als je met RDP verbinding maakt maakt Windows opeens verbinding met tig apparaten, waardoor het script meerdere keren tegelijk wordt uitgevoerd.
Omdat uitzoeken hoe ik moet filteren op één specifiek apparaat teveel werk vond heb ik er een timer tussen gezet. Het programma wordt maximaal eens per 20sec herstart. Meerdere apparaten die gelijktijdig verbinding maken worden genegeerd.

[ Voor 22% gewijzigd door defusion op 11-05-2020 00:02 ]