danielbodensee
Goto Top

Powershell-Script über Task Scheduler zeigt CMD während Ausführung

Hallo zusammen,

ich habe eine Frage die nicht direkt mit Powershell zu tun hat face-smile

Über den Task Scheduler starte ich jede Stunde ein Powershell-Script das mir ein verschiedene Verzeichnisse vom Server-Share auf den Notebook spiegelt (Robocopy). Das klappt alles, hat nur ein Schönheitsfehler dass das Script während der Ausführung ein CMD anzeigt.

Auch wenn ich im Powershell-Script die beiden Zeilen mit > $null ausblenden will, erscheint das CMD, dann halt nur noch schwarz ohne Inhalt.

Da ich die UserID des angemeldeten Windows-User brauche, kann ich das Script nicht mit meinem Admin-Account starten lassen da ich sonst den angemeldeten User nicht mehr habe.

Wie kann man den kompletten Prozess ausblenden so das kein Popup oder CMD etc erscheint? Ïch habe es schon mit einem Batch gestartet, aber das reagierte ja logischerweise gleich face-smile

Besten Dank im Voraus für Eure Hilfe.


Viele Grüsse,
Daniel

Content-ID: 305448

Url: https://administrator.de/forum/powershell-script-ueber-task-scheduler-zeigt-cmd-waehrend-ausfuehrung-305448.html

Ausgedruckt am: 22.12.2024 um 19:12 Uhr

colinardo
colinardo 26.05.2016, aktualisiert am 27.05.2016 um 09:45:58 Uhr
Goto Top
Hallo Daniel,
meinst du damit das Powershell-Konsolenfenster selber oder das Konsolenfenster einer Batchanwendung die du aus dem Powershell Anwendung heraus aufrufst?

Dafür gibt es mehrere Möglichkeiten:

Die einfachste:

Die Powershell-Konsole versteckst du mit den zusätzlichen Parametern
-WindowStyle Hidden -Noninteractive -NoProfile -NoLogo
im Argumente-Feld des Taskplaners.
Dann kann man zusätzlich im Powershell-Skript gestartete Prozesse ebenfalls versteckt starten:
start-process "deineexe oder cmd" -WindowStyle Hidden -wait  
Man kann aber auch aus einem Powershell-Skript heraus dieses verschwinden lassen:
$showWindowAsync = Add-Type –memberDefinition @"   
[DllImport("user32.dll")]   
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
"@ -name "Win32ShowWindowAsync" -namespace Win32Functions –passThru  
function Hide-PowerShell() { 
    [void]$showWindowAsync::ShowWindowAsync((Get-Process –id $pid).MainWindowHandle, 2) 
}
Hide-Powershell
Das letztere benutzt man eher wenn man statt der Konsole nur eine GUI sehen will.

Grüße Uwe

p.s. Man muss ein Skript nicht unbedingt unter deinem Useraccount laufen lassen, man kann auch aus dem Skript heraus Prozesse mit anderen Credentials starten, dafür haben die meisten CMDLets den Parameter -Credential.
DanielBodensee
DanielBodensee 26.05.2016 um 14:38:09 Uhr
Goto Top
Hallo Uwe,

vielen Dank, wieder was dazu gelernt face-smile

Werde ich morgen gleich testen, bin jetzt noch unterwegs.

Besten Dank,
Daniel
DanielBodensee
DanielBodensee 27.05.2016 um 06:41:29 Uhr
Goto Top
Hallo Uwe,

so, konnte es jetzt testen, geklappt hat es ja quasi, nur flackert kurz die Konsole bzw ein schwarzes Fenster auf, das darf auch nicht sein.

Ich muss Daten synchronisieren was alle 15 Minuten sein soll, wenn da jedesmal ein schwarzes Fenster aufflackert, dann ist das mehr störend als gut face-smile

Offenbar geht es nicht anderst?

Viele Grüsse,
Daniel
DanielBodensee
DanielBodensee 27.05.2016 um 07:15:27 Uhr
Goto Top
Ich habe mein Powershell-Script über den Scheduled Task so gestartet, das ich erst ein VBS-Script starte und aus dem heraus wird das Powershell-Script gestartet.

VBS:
Dim strPath
strPath = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\"))  
Dim strFile
strFile = "auditfilescopy.ps1"  
Dim strOptions
strOptions = "-WindowStyle Hidden -NoLogo -NonInteractive -NoProfile"  
Dim strCommand
strCommand = "powershell.exe " & strOptions & " -File " & Chr(34) & strPath & strFile & Chr(34)  
Dim objShell
Set objShell=CreateObject("WScript.Shell")  
objShell.Run strCommand, 0

So funktioniert es zumindest mal.

Aber irgendwie schade das man dieses flackern direkt nicht vermeiden kann.

Viele Grüsse,
Daniel
colinardo
colinardo 27.05.2016 aktualisiert um 09:53:17 Uhr
Goto Top
Zitat von @DanielBodensee:

Ich habe mein Powershell-Script über den Scheduled Task so gestartet, das ich erst ein VBS-Script starte und aus dem heraus wird das Powershell-Script gestartet.
Wieso das ??? Im Taskscheduler kannst du PS Skripte schön direkt unsichtbar starten.

Wenn du aus deinem PS-Skript weitere Prozesse in einer CMD startest machst du das so wie ich oben geschrieben habe mit Start-Process.

Außerdem muss man ein Skript wie oben schon geschrieben nicht zwingend als der User starten den man im Skript benötigt. Die benötigten Credentials lassen sich auch direkt im Skript an den entsprechenden Befehl übergeben(s.o.)

Ein Backup-Skript würde ich persönlich eher mit Systemrechten laufen lassen!
Aber vermutlich fehlt dir da einfach noch das Wissen wie man das umsetzt.

Grüße an den See
Uwe

-edit-
Aber irgendwie schade das man dieses flackern direkt nicht vermeiden kann.
Ach so das Flackern meinst du, hatte ich jetzt in der Schnelle überlesen, sorry. Aber wie geschrieben lass dein Skript mit einem Service-Account oder mit Systemrechten laufen. Credentials für Netzlaufwerke oder ähnliches wenn du das brauchst kannst du im Skript (auch sicher) als Secure-String Objekt übergeben.

Ein kleiner universeller Silent-Wrapper ist in c# oder AutoIt ist aber auch schnell gezimmert.
#NoTrayIcon
if $cmdline = 1 then
	Run("powershell -Windowstyle Hidden -Noninteractive -NoProfile -NoLogo -File """ & $cmdline[1] & """","",@SW_HIDE)  
endif