chris123
Goto Top

Skript wird automatisch beendet

Guten Morgen,

ich habe folgendes Thema, auf unserem Terminalserver soll erst gearbeitet werden, wenn in eimem Tool die Arbeitszeit vom Vortag erfasst ist.

Wenn die Arbeitszeit nicht erfasst wurde, wird nur das dafür zuständige Programm und Outlook gestartet. Wird das Programm zur Zeiterfassung beendet und die Zeit ist noch nicht erfasst, wird die Session auf dem Terminalserver beendet. Wurde Sie erfasst und das Programm wird beendet, dann startet die Session ganz normal, es wird der Rest geladen und es kann normal auf dem TS geladen werden.

Soweit funktioniert das auch.
Allerdings habe ich das Problem, dass nach 10 Minuten scheinbar das Skript beendet wird und die Session normal startet. Egal ob die Zeiten erfasst wurden oder nicht.

Ist das eine Einstellung, dass Skripte nur max. 10 min "on hold" sind?

Eigentlich soll das Skript durch -Wait in Zeile 10 endlos warten, bis das Programm zur Zeiterfassung beendet wird. Entweder sind Zeiten erfasst, dann geht es weiter oder nicht, dann wird die Session beendet. Wenn ich aber nichts mache und 10 Minuten warte, geht es ganz normal auf dem TS weiter. Damit ist natürlich das Skript wertlos, weil ich einfach 10 Minuten warten muss und dann normal arbeiten kann.

$testpath = Test-Path "\\FS\RR-Killswitch\RR_nicht_loeschen.txt"  
if ([string]$testpath -eq "true")   
{
$subst = 'z: "C:\Program Files\RR-Kanzlei\Userdrives\' + $env:UserName + '"'  
Start subst $subst
$result = & "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd" -S DB\RR -U rrLeistung -P 1234 -b -h -1 -Q "SET NOCOUNT ON; SELECT Eingabestatus FROM [RRKanzlei].[dbo].[vw_RR_Leistungen_Eingabe_4_Pruefung] WHERE Loginname = '$env:UserName'"  
if ([int]$result -eq 0) {
net use G: /delete /yes
Start Outlook.exe
Start z:\rrkanz\Kanzlei.exe -Wait
sleep -Seconds 2
$result = & "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd" -S DB\RR -U rrLeistung -P 1234 -b -h -1 -Q "SET NOCOUNT ON; SELECT Eingabestatus FROM [RRKanzlei].[dbo].[vw_RR_Leistungen_Eingabe_4_Pruefung] WHERE Loginname = '$env:UserName'"  
if ([int]$result -eq 0) {

Logoff

}}}

Es sind auch keine Policies ansonsten aktiv, welche das Skript beenden. Daher tippe ich, dass es eher eine grundsätzliche Einstellung ist, dass z.B. Skripte automatisch nach 10 Minuten beendet werden.

Vielen Dank für Eure Unterstützung
Chris

Content-ID: 5690060806

Url: https://administrator.de/contentid/5690060806

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

beidermachtvongreyscull
beidermachtvongreyscull 28.01.2023 aktualisiert um 10:58:32 Uhr
Goto Top
Moin,

ich sehe keine "infinite loop", insofern halte ich es für möglich, dass Powershell da einen Riegel vorschiebt. Der tut ja nix. Er wartet sich nur zu Tode.

While($true)
    { 
    $i++
    <action to invoke>
    Write-Host "Action has run $i times"   
    }

Eine Infinite Loop sollte den Nutzer da einfangen. Du musst nur sicherstellen, dass Du im richtigen Moment da auch wieder rauskommst.

Gruß
bdmvg
chris123
chris123 28.01.2023 um 11:58:07 Uhr
Goto Top
Vielen Dank!

Du musst nur sicherstellen, dass Du im richtigen Moment da auch wieder rauskommst.
Das wir aber das Problem sein. Wie soll ich bei meinem Skript da wieder rauskommen. Gehen wird das bestimmt, nur weiß ich leider nicht wie.

Wenn die Bedingung in Zeile 13 nicht erfüllt ist, dann muss ich aus dem Loop rauskommen und da weiß nicht, wie ich das mache.
Ist die Bedingung erfüllt, dann sollte der Logoff ja greifen.
Shortfred
Shortfred 28.01.2023 um 13:32:42 Uhr
Goto Top
Du musst nur sicherstellen, dass Du im richtigen Moment da auch wieder rauskommst.
Das wir aber das Problem sein. Wie soll ich bei meinem Skript da wieder rauskommen. Gehen wird das bestimmt, nur weiß ich leider nicht wie.

Um aus einem Loop rauszukommen, kannst Du die Anweisung "break" verwenden. Du kannst sie innerhalb des Loops platzieren, an der Stelle, an der Du aus dem Loop raus möchtest.

In Deinem Skript könntest Du beispielsweise folgenden Code hinzufügen, um aus dem Loop zu brechen, wenn die Bedingung in Zeile 13 nicht erfüllt ist:


if ([int]$result -eq 0) {
    net use G: /delete /yes
    Start Outlook.exe
    Start z:\rrkanz\Kanzlei.exe -Wait
    sleep -Seconds 2
    $result = & "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd" -S DB\RR -U rrLeistung -P 1234 -b -h -1 -Q "SET NOCOUNT ON; SELECT Eingabestatus FROM [RRKanzlei].[dbo].[vw_RR_Leistungen_Eingabe_4_Pruefung] WHERE Loginname = '$env:UserName'"  
    if ([int]$result -eq 0) {
        Logoff
        break
    }
}

Es ist wichtig das die Anweisung "break" innerhalb einer Schleife steht, sonst gibt es einen Fehler.

Wenn es dir nicht möglich ist eine Schleife zu verwenden, könntest du eine If-Else-Anweisung verwenden um das Skript zu beenden, wenn die Bedingung nicht erfüllt ist.

if ([int]$result -eq 0) {
    net use G: /delete /yes
    Start Outlook.exe
    Start z:\rrkanz\Kanzlei.exe -Wait
    sleep -Seconds 2
    $result = & "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd" -S DB\RR -U rrLeistung -P 1234 -b -h -1 -Q "SET NOCOUNT ON; SELECT Eingabestatus FROM [RRKanzlei].[dbo].[vw_RR_Leistungen_Eingabe_4_Pruefung] WHERE Loginname = '$env:UserName'"  
    if ([int]$result -eq 0) {
        Logoff
    }
}
else {
    Exit
}

Beide Optionen werden das Skript beenden, wenn die Bedingung in Zeile 13 nicht erfüllt ist. Welche Methode Du verwendest, hängt davon ab, welche Anforderungen Dein Skript hat.

So oder ähnlich könnte es klappen.