none
Powershell Skript startet nicht über Batch-Datei RRS feed

  • Frage

  • Hallo zusammen

    Ich habe ein Powershell Skript, welches Dateien mittels 'zip.exe' in ein anderes Laufwerk zippt.
    Dieses Skript wird über eine Batch-Datei (.bat) ausgeführt, welche beim Start von einem Service einmalig gestartet wird.

    Auf einem System funktioniert es über die Batch-Datei (Powershell startet, zippt, etc.) auf dem anderen nicht.

    Batch-Zeile: START powershell.exe -Command "& C:\scripts\Zip-Logs.ps1 -OutputPath 'G:\'

    Der Rest der Batch-Datei wird aber ausgeführt auf allen Systemen!

    Was ich bisher versucht habe:
    NTFS-Berechtigungen des Service-User auf Skript-Pfad, Zip-Pfad und Pfad der zu zippenden Dateien.
    gpedit.msc -> Log on as batch, log on as service

    Andere Ideen oder wie kann ich so etwas debuggen, wenn alles ausgeführt wird ausser Powershell?

    Grüsse

    Donnerstag, 21. August 2014 09:25

Antworten

  • Damit es loggen kann MUSST du den "Start" Befehl weglassen!

    @echo off
    setlocal
    FOR /R PFAD %%G in (*.*) DO (ren "%%~G" "%date:~6,4%_%date:~3,2%_%%~nG%%~xG")
    PowerShell.exe -Command "& C:\scripts\Zip-Logs.ps1 -OutputPath 'G:\' > C:\scripts\Debug\Analyse.log 2>&1

    Du kannst deine DOS-Batches und das PowerShell Script auch so schreiben das diese möglichst viel Loggen.

    Füge z.B. am anfang des PowerShell Scriptes eine Zeile ein die eine Meldung mit Scriptnamen und Datum + Uhrzeit + Sekunden schreibt.
    z.B.

     "Start vom Script: $($MyInvocation.MyCommand.Name) um: $(Get-Date -UFormat '%d.%m.%Y %T')" | Out-File -FilePath "C:\scripts\Debug\$($MyInvocation.MyCommand.Name).log" -Append

    z.B. kannst du auch alle ausgaben der Server.bat loggen.

    cmd.exe /Q /C server.bat > C:\scripts\Debug\Server-Bat.log 2>&1

    loggen, loggen, loggen .....!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Bearbeitet Peter Kriegel Mittwoch, 27. August 2014 11:44
    • Als Antwort markiert Powerturtle Mittwoch, 27. August 2014 12:03
    Mittwoch, 27. August 2014 11:44

Alle Antworten

  • Hi,

    Du verrätst uns nichts über die Clients - welches Betriebssystem?

    Ist das Laufwerk G:\ zur Laufzeit vorhanden? Wie wird das Skript gestartet? Über eine(n) geplante(n) Task/Aufgabe?

    Ist Powershell auf dem betroffenen System richtig installiert (muss z.B. bei XP eventuell nachinstalliert werden)?

    Nur als Info: in Deiner Angabe oben fehlen noch Anführungsstriche ("& C:\..., am Ende sind aber keine Anführungsstriche mehr). Ich schätze mal, in Deinem Skript ist es anders, weil es sonst gar nicht gehen würde.

    Gruß

    Ben

    Donnerstag, 21. August 2014 12:51
  • Vielen Dank für Ihre Antwort.

    Es spielt sich alles auf zwei redundanten Servern ab.

    Service wird gestartet und führ eine .bat-Datei aus.
    Diese erstellt Java-Prozess usw. und vohrer wird noch das Zip-Skript ausgeführt. (Jedenfalls auf einem der Server)

    System: Windows Server 2008 ohne R2 mit PowerShell v2

    Laufwerk G ist immer vorhanden. PowerShell richtig installiert. Das Skript wird wie gesagt über eine .bat-Datei gestartet wie folgt:

    START powershell.exe -Command "& C:\scripts\Zip-Logs.ps1 -OutputPath 'G:\'

    Und nein es ist ohne " am Schluss und funktioniert auf einem System.


    • Bearbeitet Powerturtle Donnerstag, 21. August 2014 14:01
    Donnerstag, 21. August 2014 14:01
  • Hi,

    ich hab das vergleichsweise mal bei mir angeschaut. Dort sind ganz am Schluss noch Anführungszeichen. Aber Du hast Recht, anscheinend geht es auch so. :-) Habs eben ausprobiert...

    Mir fällt gerade noch was ein: wurde auf dem 2. Server, wo es nicht geht, die Ausführungsrichtlinie evtl. noch nicht geändert? Die ist standardmäßig so eingestellt, dass nur signierte Powershell-Skripte ausgeführt werden.

    Mittels

    Set-ExecutionPolicy 

    kannst Du das ändern (z.B. auf "RemoteSigned" oder "Unrestricted").

    Gruß

    Ben

    Donnerstag, 21. August 2014 14:29
  • Moin,

    der Parameter ist falsch, hier ein Auszug aus dem Technet:

    -Command

    Executes the specified commands (and any parameters) as though they were typed at the Windows PowerShell command prompt, and then exits, unless the NoExit parameter is specified.

    The value of Command can be "-", a string. or a script block. If the value of Command is "-", the command text is read from standard input.

    Script blocks must be enclosed in braces ({}). You can specify a script block only when running PowerShell.exe in Windows PowerShell. The results of the script are returned to the parent shell as deserialized XML objects, not live objects.

    If the value of Command is a string, Command must be the last parameter in the command , because any characters typed after the command are interpreted as the command arguments.

    To write a string that runs a Windows PowerShell command, use the format:

    "& {<command>}"
    

    where the quotation marks indicate a string and the invoke operator (&) causes the command to be executed.

    Was du suchst ist der Parameter File:

    -File <FilePath> [<Parameters>]

    Runs the specified script in the local scope ("dot-sourced"), so that the functions and variables that the script creates are available in the current session. Enter the script file path and any parameters. File must be the last parameter in the command, because all characters typed after the File parameter name are interpreted as the script file path followed by the script parameters and their values.

    You can include the parameters of a script, and parameter values, in the value of the File parameter. For example: -File .\Get-Script.ps1 -Domain Central

    Typically, the switch parameters of a script are either included or omitted. For example, the following command uses the All parameter of the Get-Script.ps1 script file: -File .\Get-Script.ps1 -All

    In rare cases, you might need to provide a Boolean value for a switch parameter. To provide a Boolean value for a switch parameter in the value of the File parameter, enclose the parameter name and value in curly braces, such as the following: -File .\Get-Script.ps1 {-All:$False}

    Viele Grüße

    Sebastian

    Donnerstag, 21. August 2014 14:39
  • Vielen Dank für eure Antworten.

    Auf beiden Systemen ist "RemoteSigned"

    Obwohl der Parameter "falsch" ist, funktioniert es trotzdem auf einem System.
    Ich habe dies nun korrigiert, jedoch funktioniert es immer noch nicht auf einem Server.

    Habe mich per RDP mit dem Service User auf beiden Servern angemeldet und eine .bat-Datei nur mit dem PowerShell Command ausgeführt. Dies funktionierte bei beiden Systemen.

    Allem Anschein nach hat es etwas mit den Windows Services zu tun...

    Freitag, 22. August 2014 07:41
  • Hi,

    das heißt, wenn Du das Skript manuell ausführst, funktioniert es auf beiden Servern?

    Wie hast Du denn den Task eingerichtet, der das Skript beim Starten des Dienstes ausführt? Ist das eine geplante Aufgabe? Mit welchem Benutzer wird diese ausgeführt?

    Gruß

    Ben

    Freitag, 22. August 2014 12:00
  • Ja, manuell funktioniert es.

    Ein Service.

    Dieser führt beim Starten eine .bat-Datei aus. In dieser wird unter anderem das PowerShell-Skript gestartet.

    Der Service läuft unter einem AD-Benutzer (Bei beiden Services ist der gleiche AD-Benutzer)

    Freitag, 22. August 2014 13:32
  • OK, dann scheint bei dem betroffenen Server evtl. noch irgendwas mit den Berechtigungen nicht zu passen, das ist ein häufiger Fehler bei solchen Sachen.

    Funktioniert es, wenn Du dem Benutzer mal zum Test Admin-Rechte auf dem Server gibst?

    Freitag, 22. August 2014 13:55
  • Hallo PowerTurtle!

    Das doofe ist das du die Fehlermeldungen nicht siehst wenn welche kommen.

    Starte mal eine CMD.exe mit den Account des User unter dem das ausgeführt wird.

    runas /user:<DOMAIN>\<USERNAME> cmd.exe

    in dieser CMD startest du entweder die Batch oder besser nur die PowerShell Zeile (ohne Start).

    PowerShell.exe -Command "& C:\scripts\Zip-Logs.ps1 -OutputPath 'G:\'"


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 25. August 2014 08:32
  • Hi Peter,

    er schreibt ja, dass das Skript manuell ausgeführt problemlos funktioniert. Nur bei der automatischen Ausführung funzt es nicht.

    @Turtle: hast Du die Berechtigungen schon mal gecheckt? (Admin-Rechte testweise)

    Gruß

    Ben

    Montag, 25. August 2014 08:45
  • @Ben-neB ach ja das hatte ich überlesen.

    Trotzdem bleibt da der Grundgedanke, wenn man was mit Scheduled-Task oder Services macht, hilft nur loggen, loggen ,loggen....
    Da man die Fehlermeldungen ja nicht sieht tappt man sonnst im dunklen herum.

    hiermit würde ich das loggen:

    PowerShell.exe -Command "& C:\scripts\Zip-Logs.ps1 -OutputPath 'G:\'" > C:\Pfad\zum\Logfile.log 2>&1



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 25. August 2014 10:56
  • Ja, das macht Sinn! :-)
    Montag, 25. August 2014 11:29
  • Vielen Dank für eure Hilfe!

    Ich habe nun testweise den Vorschlag von Peter Kriegel in die Batch-Datei eingebunden:

    > C:\Pfad\zum\Logfile.log 2>&1

    Beim nächsten Neustart werde ich mehr wissen und mich wieder melden.

    @Ben-neB Dies werde ich auch noch versuchen, danke.

    Vielen Dank

    Mittwoch, 27. August 2014 06:49
  • EDIT:

    Leider hat es nichts geschrieben (nicht einmal die Logdatei selbst).
    NFTS-Berechtigungen sind aber auf den Zielordner vorhanden mit 'Full'

    Wenn der Service gestartet ist, sieht man einen cmd.exe Prozess auf den Serviceuser.
    In der Spalte "Command Line" sieht man folgendes: cmd.exe /Q /C server.bat

    Die ersten vier Zeilen der server.bat-Datei sind:

    @echo off
    setlocal
    FOR /R PFAD %%G in (*.*) DO (ren "%%~G" "%date:~6,4%_%date:~3,2%_%%~nG%%~xG")
    START powershell.exe -Command "& C:\scripts\Zip-Logs.ps1 -OutputPath 'G:\' > C:\scripts\Debug\Analyse.log 2>&1


    EDIT2: Admin-Rechte macht keinen Unterschied.

    • Bearbeitet Powerturtle Mittwoch, 27. August 2014 11:16
    Mittwoch, 27. August 2014 11:09
  • Damit es loggen kann MUSST du den "Start" Befehl weglassen!

    @echo off
    setlocal
    FOR /R PFAD %%G in (*.*) DO (ren "%%~G" "%date:~6,4%_%date:~3,2%_%%~nG%%~xG")
    PowerShell.exe -Command "& C:\scripts\Zip-Logs.ps1 -OutputPath 'G:\' > C:\scripts\Debug\Analyse.log 2>&1

    Du kannst deine DOS-Batches und das PowerShell Script auch so schreiben das diese möglichst viel Loggen.

    Füge z.B. am anfang des PowerShell Scriptes eine Zeile ein die eine Meldung mit Scriptnamen und Datum + Uhrzeit + Sekunden schreibt.
    z.B.

     "Start vom Script: $($MyInvocation.MyCommand.Name) um: $(Get-Date -UFormat '%d.%m.%Y %T')" | Out-File -FilePath "C:\scripts\Debug\$($MyInvocation.MyCommand.Name).log" -Append

    z.B. kannst du auch alle ausgaben der Server.bat loggen.

    cmd.exe /Q /C server.bat > C:\scripts\Debug\Server-Bat.log 2>&1

    loggen, loggen, loggen .....!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Bearbeitet Peter Kriegel Mittwoch, 27. August 2014 11:44
    • Als Antwort markiert Powerturtle Mittwoch, 27. August 2014 12:03
    Mittwoch, 27. August 2014 11:44
  • START powershell.exe -ExecutionPolicy Unrestricted -NoProfile -File C:\scripts\Zip-Logs.ps1 -OutputPath G:\

    Das war die Lösung...

    Der Hauptgrund war, dass ich im Skript beim Parameter OutputPath [ValidateScript({Test-Path $_ -PathType 'Container'})] mache.

    Irgendwie hat es die '' auch mitgenommen und da gab Test-Path nicht mehr True...

    Vielen Dank für eure Unterstützung!

    Mittwoch, 27. August 2014 12:03