.ps1 - Datei als Autostart?
Moin,
Bevor ich etwas versuche, möchte ich wissen, ob es möglich ist ein Powershell-Skript in den Autostart zu packen.
Gruß
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();
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.
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.