Köra program innan restart/shutdown

Permalänk
Medlem

Köra program innan restart/shutdown

Jag använder DisplayFusion Pro för att sätta upp profiler för min datorskärm och min TV, där jag helt enkelt kan byta mellan att använda min datorskärm eller TV som primär display. Det är alltså en profil som heter "Skrivbord" och en som heter "TV".

Problemet jag upplever är att om jag har profilen "TV" aktiv när jag stänger av eller startar om datorn, så är den fortsatt den aktiva profilen när Windows startar igen. Jag skulle vilja att "Skrivbord" alltid är den profil som aktiveras så fort datorn startas ånyo. Man kan komma runt det på sätt och vis genom att skapa en genväg till DisplayFusionCommand.exe med parametern "-monitorloadprofile 'Skrivbord'" som körs på uppstart, men problemet med det är att Windows inte öppnar programmet förens användaren loggat in. Det har tydligen med begränsningar i Windows att göra, att det inte går att komma åt displayinställningar förens användaren loggat in.

Detta medför att jag antingen måste slå på TV:n för att se inloggningsrutan eller skriva in lösenordet i blindo och hoppas att jag skriver rätt. Det är absolut görbart, men jag har gjort så tidigare och det är rätt jobbigt om man slinter på lösenordet och misslyckas att logga in. Det blir mycket jobb med att gå fram och tillbaka mellan TV och datorskärm.

Jag tänker att det potentiellt skulle kunna gå att lösa på två sätt:

  1. Få Windows att utföra ett kommando innan omstart/avstängning. Dvs. att Windows startar kommandot nämnt ovan och sedan inväntar detta innan den faktiska omstarten/avstängningen/utloggningen påbörjas. Har försökt ställa in Group Policies för detta eftersom det där finns möjlighet att köra script vid antingen avstängning av systemet eller utloggning av användare, men det fungerar dessvärre inte. Jag skulle tro att kommandot behöver köras medan användaren är inloggad, alltså innan utloggningen genomförs, och inte under tiden. Så det skulle i sådana fall vara om det går att försena den faktiska utloggningen tills det att kommandot har kört?

  2. Kringgå inloggningen genom att helt enkelt stänga av det. Alltså att jag vid start av Windows automatiskt loggas in och inte behöver ange varken lösenord eller PIN-kod. Detta ska vara möjligt att göra, men guiden som jag följt nämner kryssrutan Users must enter a user name and password to use this computer, vilken inte är synlig för mig. Någon som vet varför?

Permalänk

Du kan prova att köra de som ett logoff script.

Du bör hitta de under
gpedit.msc
User Configuration/Windows Settings/Scripts/logon/logoff

Permalänk
Medlem
Skrivet av TorrentKatten:

Du kan prova att köra de som ett logoff script.

Du bör hitta de under
gpedit.msc
User Configuration/Windows Settings/Scripts/logon/logoff

Precis, men som jag skrev ovan så verkar det inte fungera. Jag vet inte riktigt varför, men jag kan tänka mig att det är för att scriptet körs under tiden utloggningen sker och antingen att det då inte hinner utföras innan användaren är utloggad eller att det av någon anledning gör så att DisplayFusionCommand.exe inte är nåbar under tiden utloggningen sker.

Jag lyckades dock med alternativ två, att stänga av kravet på inloggning när Windows startar, så nu loggas jag automatiskt in och kan då köra kommandot för att byta till "Skrivbord"-profilen. Det var en ändring i Registry Editor som behövdes för att visa kryssrutan jag nämnde ovan i Windows 11.

Men är idel öra om det hela skulle kunna gå att lösa på ett mer elegant sätt. Det funkar absolut, men det tar ett tag för kommandot att köras efter inloggning, så bästa hade ju helt enkelt varit (tror jag) om profilbytet sker vid shutdown/restart. Är inte lika ivrig att det ska gå snabbt vid avstängning som vid uppstart.

Permalänk
Medlem

För att förtydliga så hade det önskade resultatet varit att jag trycker "stäng av" eller "starta om" och att Windows då stannar ett tag för att köra kommandot. Och att den faktiska avstängningen initieras först när kommandot har körts och profilen är bytt. Klickar jag "starta om" i nuläget med ett script angivet på antingen shutdown eller logoff i gpedit.msc så går Windows direkt till svart skärm med "Restarting..." och jag misstänker att någonting utanför min kunskap händer i bakgrunden som gör det svårt för kommandot att köra, om det nu är att DisplayFusionCommand.exe helt sonika förhindras att starta under tiden datorn stänger ner eller om det är något annat som lurar.

Permalänk
Skrivet av toge:

Precis, men som jag skrev ovan så verkar det inte fungera. Jag vet inte riktigt varför, men jag kan tänka mig att det är för att scriptet körs under tiden utloggningen sker och antingen att det då inte hinner utföras innan användaren är utloggad eller att det av någon anledning gör så att DisplayFusionCommand.exe inte är nåbar under tiden utloggningen sker.

Jag lyckades dock med alternativ två, att stänga av kravet på inloggning när Windows startar, så nu loggas jag automatiskt in och kan då köra kommandot för att byta till "Skrivbord"-profilen. Det var en ändring i Registry Editor som behövdes för att visa kryssrutan jag nämnde ovan i Windows 11.

Men är idel öra om det hela skulle kunna gå att lösa på ett mer elegant sätt. Det funkar absolut, men det tar ett tag för kommandot att köras efter inloggning, så bästa hade ju helt enkelt varit (tror jag) om profilbytet sker vid shutdown/restart. Är inte lika ivrig att det ska gå snabbt vid avstängning som vid uppstart.

Ah, missade att du testat via Grupp Policy. Sorry. Det är inte så att ditt kommando DisplayFusion kräver admin? Logoff script körs som användaren. Har inga windows maskiner kvar, men har för mig att de iaf på Win Server fanns/finns maskin shutdown script och generiska user login/off script.

Googlar jar lite snabbt så låg de under Computer Settings/Windows Settings/Scripts. men hittar bara refs till de för win server dokumentationen. De scripten ska köras direkt av script hosten som SYSTEM iirc

Permalänk
Medlem
Skrivet av TorrentKatten:

Ah, missade att du testat via Grupp Policy. Sorry. Det är inte så att ditt kommando DisplayFusion kräver admin? Logoff script körs som användaren. Har inga windows maskiner kvar, men har för mig att de iaf på Win Server fanns/finns maskin shutdown script och generiska user login/off script.

Googlar jar lite snabbt så låg de under Computer Settings/Windows Settings/Scripts. men hittar bara refs till de för win server dokumentationen. De scripten ska köras direkt av script hosten som SYSTEM iirc

Jag tror inte det ska kräva admin. Borde det dyka upp en UAC då? Annars skulle det ju kunna vara att scriptet som sådant är fel. Jag har bara utgått ifrån att en .bat-fil bör fungera? Jag har satt det till en .bat-fil som funkar när jag dubbelklickar på den manuellt, så det borde ju inte vara något fel på själva scriptet i sig.

Permalänk
Medlem

Scriptet jag kör ser ut såhär:

@echo off start /b "" "C:\Program Files\DisplayFusion\DisplayFusionCommand.exe" -monitorloadprofile "Skrivbord" exit

Permalänk

De finns inga spår av de i systemloggen? sök på "Loggboken" på en svensk windowsmaskin i start menyn. Tycker windows loggar de mesta, så tycker att ett misslyckat script borde ha loggats

Permalänk
Medlem

Det där startkommandot oroar mig lite. Start innebär ju att du skapar en ny process och sätter du inte /wait på den kommer maskinenen att gå vidare utan att vänta på resultatet.
Prova utan start och se vad som händer

Visa signatur

Arbetsdator: HFX Mini. Ryzen 3600, GTX1650. Skärmar: Dell 2415

Permalänk
Medlem
Skrivet av TorrentKatten:

De finns inga spår av de i systemloggen? sök på "Loggboken" på en svensk windowsmaskin i start menyn. Tycker windows loggar de mesta, så tycker att ett misslyckat script borde ha loggats

Ska kolla det!

Skrivet av mats42:

Det där startkommandot oroar mig lite. Start innebär ju att du skapar en ny process och sätter du inte /wait på den kommer maskinenen att gå vidare utan att vänta på resultatet.
Prova utan start och se vad som händer

Ja, jag har aldrig använt batch så jag saxade det från nätet utan att veta riktigt vad det gjorde mer exakt. Är det så här du menar att jag ska skriva det?

@echo off /b "" "C:\Program Files\DisplayFusion\DisplayFusionCommand.exe" -monitorloadprofile "Skrivbord" exit

Och hur skriver jag in /wait? Jag skulle ju kunna testa att sätta exempelvis fem sekunders wait bara för att ge det lite tid. Ser som sagt hellre att avstängning/omstart tar längre tid än uppstart.

Permalänk
Medlem

Det kanske går att pausa skriptet medan den jobbar lite, sen kör du bara shutdown också?

Permalänk
Medlem

Går det att använda windows inbyggda "Schemaläggaren" och sätta vid upplåsning? På så vis körs det inte innan i alla fall.

Visa signatur

Fractal Design Define XL R2, Corsair RM1000 1000W, Ryzen 9 3950X @ 3.49GHz, 32GB, MSI GTX 1080 Ti Sea Hawk X 11GB, 6TB HDD, 970 EVO Plus

Permalänk
Medlem
Skrivet av xallrons:

Går det att använda windows inbyggda "Schemaläggaren" och sätta vid upplåsning? På så vis körs det inte innan i alla fall. https://i.imgur.com/TXCA5lw.png

Tyvärr inte. Testat det, men enligt utvecklarna av DisplayFusion så kan inget rörande skärmen starta innan inloggning, eftersom inställningarna för det inte är tillgängliga vid det skedet.

Permalänk
Medlem

även /b bör bort

Visa signatur

Arbetsdator: HFX Mini. Ryzen 3600, GTX1650. Skärmar: Dell 2415

Permalänk
Medlem
Skrivet av toge:

Scriptet jag kör ser ut såhär:

@echo off start /b "" "C:\Program Files\DisplayFusion\DisplayFusionCommand.exe" -monitorloadprofile "Skrivbord" exit

När jag tittar på raden i ditt skript ser det ut som

start /b "" "C:\Program Files\DisplayFusion\DisplayFusionCommand.exe" -monitorloadprofile "Skrivbord"

den logiska beskrivningen av raden är

program [parameter] [värde] [värde] [värde] [värde]

logiken för en kommandorad brukar vanligen vara

program [ [ parameter | parameter=värde] ... ] [ värde ... ]

I ditt fall så tror jag du helt enkelt bara delar ut en parameter och ett gäng värden till start som programmet inte förstår vad det ska göra med om det inte finns en exakt innebörd av en logik här. Även det tomma citatet direkt efter /b ser ganska konstigt ut, om det inte är så att värdenas innebörd är statiska.

Eftersom det står i en skript fil där @echo off tar bort ekot till skärmen och sedan exit avslutar skriptet så borde det vara så att start skall starta skriptet och inte programmet. skriptet i sig kör programmet av sig själv, det är det som är meningen med ett skript då det är en lista av kommandon som körs en efter en.

I praktiken borde du kunna köra detta från en terminal och få rätt resultat:

"C:\Program Files\DisplayFusion\DisplayFusionCommand.exe" -monitorloadprofile Skrivbord

Det kan även vara så att citattecknen på sista värdet gör något goofy med raden.
Jag skulle annars tro att det är denna rad som ska stå i ditt skript och att start eller något annat ska starta detta skript, inte köras i skriptet.
terminalskript brukar vanligtvis bara köra dom saker som ska genomföras som om dom skrevs rad för rad. Det är externa program som ansvarar för hur eller när ett skript körs. Inget man skriver i skriptet annat än om skriptet behöver exklusivt testa något.

Ett exempel är att synkronisera en sparad ramdisk från förra avstängningen:

rsync -av /mnt/persistent_ramdisk /mnt/ramdisk/

Programvaran rsync uppdaterar här en katalog mot en annan och ser här till att alla filer är uppdaterade . Det är parametrarna och värdena på samma rad som rsync som bestämmer hur det går till och vad som uppdateras, tas bort, säkerhetskopior etc.

Det är programvaran som kör skriptet som bestämmer hur det körs, hur ofta och vem som får köra skriptet. Dvs är rätt person inloggad, är datorn inkopplad i vägg eller batteri, Hur ofta ska det köras etc.

Visa signatur

Server: Fractal design Define 7 XL | AMD Ryzen 7 5800X 8/16 | ASUS ROG CROSSHAIR VIII DARK HERO | 64GB Corsair @ 3000MHz | ASUS Radeon RX 460 2GB | Samsung 960 PRO 512 GB M.2 | 2x 2TB Samsung 850 PRO SSD | 6x Seagate Ironwolf Pro 10TB
WS: Phantex Entoo Elite | AMD Ryzen Threadripper 1950X 16/32 | ASUS Zenith extreme | 128GB G.Skill @ 2400MHz | ASUS Radeon HD7970 | 3x 2TB Samsung 960PRO M.2 | 6x Seagate Ironwolf Pro 10 TB
NEC PA301W 30" @ 2560x1600 | Linux Mint 21.3 Cinnamon

Permalänk
Medlem
Skrivet av OldComputer:

När jag tittar på raden i ditt skript ser det ut som

start /b "" "C:\Program Files\DisplayFusion\DisplayFusionCommand.exe" -monitorloadprofile "Skrivbord"

den logiska beskrivningen av raden är

program [parameter] [värde] [värde] [värde] [värde]

logiken för en kommandorad brukar vanligen vara

program [ [ parameter | parameter=värde] ... ] [ värde ... ]

I ditt fall så tror jag du helt enkelt bara delar ut en parameter och ett gäng värden till start som programmet inte förstår vad det ska göra med om det inte finns en exakt innebörd av en logik här. Även det tomma citatet direkt efter /b ser ganska konstigt ut, om det inte är så att värdenas innebörd är statiska.

Eftersom det står i en skript fil där @echo off tar bort ekot till skärmen och sedan exit avslutar skriptet så borde det vara så att start skall starta skriptet och inte programmet. skriptet i sig kör programmet av sig själv, det är det som är meningen med ett skript då det är en lista av kommandon som körs en efter en.

I praktiken borde du kunna köra detta från en terminal och få rätt resultat:

"C:\Program Files\DisplayFusion\DisplayFusionCommand.exe" -monitorloadprofile Skrivbord

Det kan även vara så att citattecknen på sista värdet gör något goofy med raden.
Jag skulle annars tro att det är denna rad som ska stå i ditt skript och att start eller något annat ska starta detta skript, inte köras i skriptet.
terminalskript brukar vanligtvis bara köra dom saker som ska genomföras som om dom skrevs rad för rad. Det är externa program som ansvarar för hur eller när ett skript körs. Inget man skriver i skriptet annat än om skriptet behöver exklusivt testa något.

Ett exempel är att synkronisera en sparad ramdisk från förra avstängningen:

rsync -av /mnt/persistent_ramdisk /mnt/ramdisk/

Programvaran rsync uppdaterar här en katalog mot en annan och ser här till att alla filer är uppdaterade . Det är parametrarna och värdena på samma rad som rsync som bestämmer hur det går till och vad som uppdateras, tas bort, säkerhetskopior etc.

Det är programvaran som kör skriptet som bestämmer hur det körs, hur ofta och vem som får köra skriptet. Dvs är rätt person inloggad, är datorn inkopplad i vägg eller batteri, Hur ofta ska det köras etc.

Tack för rättelse!

Ska sägas att det kommando jag skrev ovan fungerar om jag kör det manuellt (alltså bara dubbelklickar på scriptet), men när jag skriver

"C:\Program Files\DisplayFusion\DisplayFusionCommand.exe" -monitorloadprofile Skrivbord

som du föreslår så verkar det gå lite snabbare.

Hur som helst så testade jag att lägga till scriptet först på "shutdown", vilket inte fungerade. Jag testade sen att lägga in det på "logoff" samt att jag aktiverade "Display instructions in logoff scripts as they run" under System > Scripts. Detta gör att eventuella processer som körs under tiden "Restarting..." dyker upp visas. Och då fungerade det! Tack för hjälpen!

Provade även att aktivera motsvarigheten för "shutdown", dvs "Display instructions in shutdown scripts as they run" eller liknande. Men det fungerade inte. Kanske för att DisplayFusion inte är nåbar i det skedet.