2016-12-15 17 views
1

Ich habe ein sehr kleines Skript, das ich versuche zu laufen und zu testen. Siehe unten:Variable wird nicht aktualisiert

$value = Get-Content C:\Temp\cdrc2g.txt 

if ($value -ge 3600) 
{ 
    Invoke-Expression C:\Scripts\Email.ps1 
} 

Es gibt eine Textdatei namens „cdrc2g.txt“, die alle 15 Minuten mit einem numerischen Wert aktualisiert zu werden. Ich versuche, das oben genannte in Taskplaner jede Stunde auszuführen. Beim Testen habe ich festgestellt, dass $value nicht aktualisiert wird, wenn sich die Datei ändert. Es scheint, als ob es die allererste Nummer ergreift und niemals aktualisiert.

Zum Beispiel, wenn ich die cdrc2g.txt Datei manuell auf eine Nummer höher als 3600 ändern, passiert nichts. Es sollte mir eine E-Mail senden, aber PowerShell sieht den unterschiedlichen Wert nicht. Ich habe bestätigt, dass PowerShell nicht ausgeführt wird, und schließt vollständig, nachdem der Taskplaner ausgeführt wurde. Was kann ich tun, damit die $value jedes Mal aktualisiert wird, wenn Task Scheduler dieses Skript ausführt?

Antwort

0

Sie suchen wahrscheinlich für die -tail Parameter:

$value = Get-Content C:\Temp\cdrc2g.txt -Tail 1 

Dies wird den letzten Eintrag immer wieder.

+0

der Beurteilung durch die Eingabe nehmen -tail 1 verwenden gibt es nur 1 Nummer in die Datei? – 4c74356b41

+0

@ 4c74356b41 Ich bin mir da nicht sicher, da er auch schrieb: * schnappt sich die allererste Nummer * –

+0

oh richtig, ich habe das nicht bemerkt, das würde auch das Verhalten erklären. – 4c74356b41

1

Wird der Wert aktualisiert, wenn Sie das Skript manuell ausführen?

Wenn Sie

sagen, ich habe bestätigt, dass Powershell nicht ausgeführt wird, und schließt vollständig nach Aufgabenplanung durchgeführt wird.

Meinen Sie, dass Sie erwarten, dass PowerShell ausgeführt wird, sobald das Skript abgeschlossen ist?

Vielleicht brauchen Sie eine Schleife, um das Skript laufen zu lassen und die Datei neu zu bewerten? somtehing wie:

While ($True) { 
    $value = Get-Content C:\Temp\cdrc2g.txt 

    if ($value -ge 3600) { 
     Invoke-Expression C:\Scripts\Email.ps1 
    } 
    Start-Sleep -Seconds (15*60) 
} 

Vielleicht ist das Skript aufgrund von Berechtigungen die Datei von der geplanten Aufgabe zu lesen oder einer Datei zu sperren oder etwas nicht in der Lage. Sie könnten der Wert der Lage bestätigen ist durch die Planung einer Aufgabe wie zu lesen:

Get-Content C:\Temp\cdrc2g.txt | Out-File C:\Temp\test.txt -append 

Dann überprüfen Sie die Datei test.txt, nachdem es läuft.

0

Jungs Danke für die Eingabe. Die Textdatei hätte nur eine Nummer - die Sekunden repräsentiert. Ein Kollege hat mir gezeigt, wenn ich mein Skript geändert enthalten [int] wie folgt:

[int] $ value = Get-Content C: \ Temp \ cdrc2g.txt

if ($ value -ge 3600) {Invoke-Ausdruck C: \ Scripts \ Email.ps1}

Mein Problem ging weg. Ich konnte den Wert in der Textdatei ändern und meine geplante Aufgabe erneut ausführen, und es funktionierte wie gewünscht.

0

können Sie Option -wait get-content Befehl, diese Option warten, wenn die Datei geändert wird, letzte Zeile der Datei

gc "C:\Temp\cdrc2g.txt" -Wait -Tail 1 | where { $_ -eq "3600"} | Invoke-Expression C:\Scripts\Email.ps1 
+2

Bitte fügen Sie eine Erklärung, wie dies das Problem löst - so dass der Fragesteller von Ihnen lernen kann – Mikkel

+1

@Mack das ist eine Antwort, die es Code ist nur macht es nicht NAA oder VLQ, es macht es nur schwach –

+0

glücklich Misters? ;) – Esperento57

Verwandte Themen