semsente
Goto Top

VBS in Aufgabenplanung richtig Einstellen

Hallo, ich habe jetzt nach langem hin und her endlich geschafft ein vbs Skript durch die Aufgabenplanung nach dem Starten des PC jede Minute auszuführen. Leider haben diese Einstellungen so, dass es funktioniert zur Folge, dass jedes mal eine neue Instanz gestartet wird, und die alte nicht beendet wird, sodass sich nach einiger Zeit ein ganzer Haufen an Prozessen der Aufgabenplanung und Windows PowerShell anhäufen. Ich habe zwar eingestellt die Aufgabe nach 1 Minute zu beenden, aber dies scheint nicht ganz zu funktionieren. In den weiteren Einstellungen habe ich die Regel, dass falls die Aufgabe bereits ausgeführt wird eine neue Instanz parralel ausgeführt werden soll, da keine der anderen Möglichkeiten zu einem Erfolg geführt haben.
Was könnte es da für Lösungen geben?

Content-Key: 4102726788

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

Printed on: April 27, 2024 at 01:04 o'clock

Mitglied: 4091525239
4091525239 Sep 29, 2022 updated at 17:36:18 (UTC)
Goto Top
Moin.Moin.
Ich bin jetzt mal ganz unverschämt und stelle die Frage "Was genau macht das Skript überhaupt und wie sehen sämtliche Einstellungen des Tasks aus?"
Es bringt ja nichts an den Symptomen rum zu Doktor'n wenn man die Ursache beheben könnte! Irgendwas scheint da ja in deinem Skript schief zu laufen, nur zum Hellsehen ist mir meine Zeit aber ehrlich gesagt zu schade.

P.
Member: Crusher79
Crusher79 Sep 30, 2022 updated at 21:04:08 (UTC)
Goto Top
Hallo,

lass mich raten: VBS damit PS die Klappe hält? Also Fenster nicht aufpoppt?

Die Lösung ist ganz einfach. Das Probem gibt es doch auch bei Backups etc. Wie sag ichs meinen Kinde?

.lock oder .lck - da kann man kreativ sein!

Wenn im PS lck schreibt, dann kannst du dies hernehmen dass der Job gerade läuft. Startet PS erneut, einfach eine if Bedingung einfügen. Wenn laueft.lck vorhanden, dann tue nichts. PS wird beendet und das war es.

Verfeinern geht auch. Wenn es crasht und die lck liegen bleibt tut PS Script nie mehr was. Man kann einfach die Datei händisch löschen oder aber automatisch.

Automaitisch? PowerShell kann gut mit einem Datum umgehen. Einfach Datum/ Zeit mit der Datei vergleichen. Ist die älter als x Minuten lösche die Weg. Zack das Programm läuft wieder.

ACHTUNG. CreationTime ist unser Feind - File System Tunneling: https://www.msxfaq.de/code/filsystemtunnel.htm

LastWriteTime und die Sache ist rund. Vergleichst du immer diese Attribut mit der Tageszeit sollte es laufen.

Hinweis:
- aus meinen produktiven entnommen. Sollte aber laufen
- Zeitunterschied und Lock Datei schreiben in Funktionen verpackt
- Hier nach 10 min. automatischer Release
- Neuanlage der LCK Datei, damit immer aktuelle Zeit herangezogen wird!
- File System Tuenneling auf die Spitze getrieben! Man kann auch direkt LastWriteTime hernehmen.
- RestartBMV ist wieder eine Funktion die den eigentlich Code ausführt!
-- da musst du dein Script/ Block oder Function einsetzen!!! Der eig. Call.


[string]$lckFile = "C:\temp\in_arbeit.lck"  

Function CreateLckFile() { 
            $null = New-Item -ItemType "file" -Path $lckFile;   
            # Fix NTFS Tunnellig
            $(Get-Item -Force $lckFile).CreationTime = $(Get-Item -Force $lckFile).LastWriteTime; 
            }

Function LckTimeDiff() {
            $lckFileCreationTime = $((Get-Item $lckFile).CreationTime)
            $Diffobj = $(Get-Date) - $lckFileCreationTime
            [int]$Script:DiffInMin = [int]$Diffobj.TotalMinutes
            }

Function LckAndStart() {  
    if (! (Test-path -path $lckFile)) {
        CreateLckFile
        RestartBMV       
        Remove-Item $lckFile -Force
    } else { 
        LckTimeDiff                            
        IF ($DiffInMin -gt 10 ) {                            
            Remove-Item $lckFile -Force   
            CreateLckFile
            RestartBMV     
            Remove-Item $lckFile -Force                
            } 

    }
}

LckAndStart

mfg Crusher
Member: Semsente
Semsente Oct 01, 2022 at 16:06:02 (UTC)
Goto Top
Vielen Dank für die Antworten. Ja VBS damit PS nicht aufploppt. Das nutze ich um dem Webseiten hoster Godaddy jede Minute meine aktuelle IP mitzuteilen quasi als ddns Service.
Für das VBS habe ich
CreateObject("Wscript.Shell").Run "powershell -executionpolicy bypass -noexit -file C:\Users\xxx\xxx.ps1",0,True  

Für PS1
$mydomain = "xxx.de"  
$myhostname = "@"  
$gdapikey = "xxx"  

$myip = Invoke-RestMethod -Uri "https://api.ipify.org"  
$dnsdata = Invoke-RestMethod "https://api.godaddy.com/v1/domains/$($mydomain)/records/A/$($myhostname)" -Headers @{ Authorization = "sso-key $($gdapikey)" }  
$gdip = $dnsdata.data
Write-Output "$(Get-Date -Format 'u') - Current External IP is $($myip), GoDaddy DNS IP is $($gdip)"  

If ( $gpid -ne $myip) {
  Write-Output "IP has changed!! Updating on GoDaddy"  
  Invoke-RestMethod -Method PUT -Uri "https://api.godaddy.com/v1/domains/$($mydomain)/records/A/$($myhostname)" -Headers @{ Authorization = "sso-key $($gdapikey)" } -ContentType "application/json" -Body "[{`"data`": `"$($myip)`"}]";  
}

Die Einstellungen in der Aufgabenplanung sind folgende
unbenannt 5
unbenannt 2
unbenannt 4
unbenannt 3
unbenannt 1
Mitglied: 4091525239
4091525239 Oct 01, 2022 updated at 16:33:03 (UTC)
Goto Top
Hier hast du deinen Übeltäter
-noexit
Der Parameter führt dazu das die Powershell-Session nach dem Skript offen bleibt und nie geschlossen wird ...
Member: Crusher79
Crusher79 Oct 01, 2022 at 17:39:47 (UTC)
Goto Top
Zitat von @4091525239:

Hier hast du deinen Übeltäter
-noexit
Der Parameter führt dazu das die Powershell-Session nach dem Skript offen bleibt und nie geschlossen wird ...

Oh man face-big-smile

Dennoch könnte man PS optimieren. Gerade beim Webrequest wegen des Timeout

1 min Abstand ist nicht viel. Insbesondere wenn man sich den Standard Timeout ansieht. Alternativ könnte man auch über einen Loop innerhalb von PS nachdenken. Lock Datei ist da vlt. etwas viel ....

Optimieren lässt es sich, wenn du die IP bei dir lokal zwischen speicherst. Die godaddy IP wird sich ja nur auf Auruf ändern. Hast du keine Änderung, brauchst du die API doch gar nicht ansprechen.

Hast du eine neue IP, dann den Abgleich mit der godaddy IP dann nur als Erfolgskontrolle nach IP Änderung machen.

mfg Crusher