.ps1 - Datei als Autostart?

2 Antworten

PowershellScripte im Autostart werden mit der Standardaktion für .ps1-Dateien ausgeführt und das ist "bearbeiten im Editor" . Ergo öffnet sich die Datei im Notepad.

Ohne das standardvorgehen in der Registry zu ändern , oder eine Verknüpfung klappt es also nicht.

Eine elegante Alternative wäre, das Powershell-Script als Batch. zu tarnen.

Powershell-Hybrid-Batch.cmd

<# : Batch Abschnitt
start "" powershell -c "&([Scriptblock]::Create((gc '%~f0' -enc UTF8 -raw )))"
exit /b
: Ende Batch Abschnitt #>

#hier  Dein Powershellcode:
Write-Host Hallo Welt -fo green
Write-Host Γεια σου Κόσμο  -fo mag
Write-Host Viele Grüße aus Powershell -fo red
pause

Ich benutze diese Hybrid-Technik schon seit Jahren ohne Probleme. selbst mit komplexen Powershellscripten

DeskClock.cmd

<# : Batch Abschnitt ,Batch sieht in dieser Zeile die Eingabe aus der Datei # an ein SprungLabel, Powershell sieht den begin eines Kommentars. 
:: etwas Tricky um Consolenfenster nur  so kurz wie Möglich sichtbar zu lassen
:: erstmal minimierten Start von Powershell erzwingen ( bis Powershell den Parameter -WindowStyle Hidden ausführen kann)
:: akzeptiert UTF8 gespeicherte Scripte
start "" /min powershell -WindowStyle hidden "&([Scriptblock]::Create((gc '%~f0' -enc UTF8 -raw )))"
exit /b
: Ende Batch und Powershellkommentar #>

using namespace System.Windows.Forms
using namespace System.Drawing

$WindowTitle='DesktopUhr'
#Wenn es bereits läuft  raus
$Mut = New-Object System.Threading.Mutex($True, $WindowTitle)
if (!$Mut.WaitOne(0)) {
    $Mut.Close();
    (New-Object -c Wscript.Shell).Popup("$WindowTitle is running",2,"",0)
    exit
}
Add-Type -a 'System.Windows.Forms'

$DisplayFont = [Font]::new("Consolas",32,[FontStyle]3)
$TimeDisplayFormat='HH:mm:ss'

$ClockDisplay = New-Object 'Label'
$ClockDisplay.Font = $DisplayFont
$ClockDisplay.Text = (Get-Date).ToString($TimeDisplayFormat)
$ClockDisplay.AutoSize = $True
$ClockDisplay.ForeColor = '255,0,0'

$Form = New-Object 'Form'
$Form.Text = $WindowTitle 
$Form.FormBorderStyle = 0 #Rahmen aus
$Form.TopMost = $True
$Form.StartPosition = 'manual'
$Form.Location = '30,30'
$Form.BackColor = '0,0,0' #schwarz
$Form.TransparencyKey = $Form.BackColor #kein Hintergrund
$Form.Controls.Add($ClockDisplay)
$Form.Size = $Form.PreferredSize


$Timer1 = New-Object 'Timer'
$Timer1.Enabled = $True
$Timer1.Interval = 100
$Timer1_Action={
    $ClockDisplay.Text = (Get-Date).ToString($TimeDisplayFormat) 
}
$Timer1.add_Tick($Timer1_Action)
[Application]::Run($Form)
$Mut.ReleaseMutex(); 
$Mut.Dispose();


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Rowal  24.09.2024, 21:08

Das ist genial und eine Lösung in allen Fällen, in denen die Option geboten wird, eine Batchdatei auszuführen aber keine Powershell-Datei.

Ja klar, das geht. Das Ausführen von Skripten muss erlaubt sein.


kekw2305 
Beitragsersteller
 29.08.2024, 13:09

Ich habe jetzt mal eine Sünde begangen und die ExecutionPolicy auf unrestricted gesetzt.
Werde das Skript dann mal in den Autostart-Ordner reinschmeißen und schauen, ob es morgen anschlägt.