marcimarc85
Goto Top

Benötige Powershell, die Tage zwischen zwei Daten ausgibt

Hintergrund:
ich möchte mit unserem Monitoring Tool , Lizenzen unserer Software überwachen bzw. wann diese Ablaufen, damit ich rechtzeitig neue anfordere.
Dazu wollte ich eine Powershell Abfrage machen, die Das heutige Datum ausliest und es mit dem Datum in der Lizendatei oder manuell per Parameter, den ich beiM Aufruf des Scriptes mitgebe vergleicht und die Tage dazwischen, als Wert, ausgibt.

Folgendes Script habe ich dazu gefunden, welches abe rnicht funktioniert:
Param([string]$ExpirationDate)

$DateDifference = New-TimeSpan -Start (Get-Date -format d) -End $ExpirationDate
$Days = $DateDifference.Days
$DaysPassed = ($Days * -1)
if($Days -gt 0){
                Write-Host "$($Days):License expires in $($Days) day(s)."  
                exit 0 }
if($Days -eq 0){
                Write-Host "$($Days):The license expires today!";  
                exit 1
}
if($Days -lt 0){
                Write-Host "0:License expired for $($DaysPassed) days!"  
                exit 1
}

ich bekomme beim aufruf von expire.ps1 -ExpirationDate="31.01.2019" folgende Fehlermeldung:

New-TimeSpan : Der Parameter "End" kann nicht gebunden werden. Der Wert "-ExpirationDate=31.01.2019" kann nicht in den  
Typ "System.DateTime" konvertiert werden. Fehler: "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."  
In C:\Users\Administrator\Desktop\expire.ps1:3 Zeichen:65
+ $DateDifference = New-TimeSpan -Start (Get-Date -format d) -End $ExpirationDate
+                                                                 ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-TimeSpan], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.NewTimeSpanCommand


Kann mir evtl. jemand sagen, was der Fehler ist, oder ein alternatives Script liefern?

Vielen Dank im Voraus

Content-Key: 380915

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

Printed on: April 18, 2024 at 23:04 o'clock

Member: colinardo
colinardo Jul 20, 2018 updated at 13:10:46 (UTC)
Goto Top
Servus.
ich bekomme beim aufruf von expire.ps1 -ExpirationDate="31.01.2019" folgende Fehlermeldung:
Kein Wunder, das Gleichheitszeichen hat da nichts zu suchen bei deinem Aufruf!
.\expire.ps1 -ExpirationDate "31.01.2019" 
Grüße Uwe
Member: erikro
erikro Jul 20, 2018 at 12:54:22 (UTC)
Goto Top
Moin,

ist doch klar:


Zitat von @MarciMarc85:
Param([string]$ExpirationDate)

Wenn Du einer Variablen explizit den Datentyp string gibst, dann ist da auch ein string und kein date drin, auch wenn der string ein Datum ist. ;)

hth

Erik
Member: colinardo
colinardo Jul 20, 2018 updated at 13:03:47 (UTC)
Goto Top
Zitat von @erikro:
Wenn Du einer Variablen explizit den Datentyp string gibst, dann ist da auch ein string und kein date drin, auch wenn der string ein Datum ist. ;)
Das ist hier ausnahmsweise egal da das CMDLet den String für den Parameter automatisch anhand der aktiven "Culture" in ein Date-Object konvertiert.
Member: erikro
erikro Jul 20, 2018 updated at 13:09:24 (UTC)
Goto Top
Moin,

Zitat von @colinardo:

Zitat von @erikro:
Wenn Du einer Variablen explizit den Datentyp string gibst, dann ist da auch ein string und kein date drin, auch wenn der string ein Datum ist. ;)
Das ist hier ausnahmsweise egal da das CMDLet den String automatisch anhand der aktiven "Culture" in ein Date-Object konvertiert.

Die vorherige Umwandlung des Datums in einen String in Zeile 3 für den Parameter "-Start" ist ebenfalls überflüssig.

Stimmt. Pfui, Microsoft! ;) Dann verstehe ich das aber gar nicht mehr. Ich hab's so in meine ISE kopiert, gespeichert und es funktioniert mit und ohne [string]. Dann liegt das Problem wohl bei der Eingabe des Datums. Bei mir kommt die Meldung nur, wenn ich ein falsches Datum eingebe:

PS P:\ps1> .\datespam.ps1 31.01.2019
195:License expires in 195 day(s).
PS P:\ps1> .\datespam.ps1 31.02.2019
New-TimeSpan : Der Parameter "End" kann nicht gebunden werden. Der Wert "31.02.2019" kann nicht in den Typ  
"System.DateTime" konvertiert werden. Fehler: "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."  
In P:\ps1\datespam.ps1:3 Zeichen:65
+ $DateDifference = New-TimeSpan -Start (Get-Date -format d) -End $ExpirationDate
+                                                                 ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-TimeSpan], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.NewTimeSpanCommand

0:License expired for  days!
PS P:\ps1> .\datespam.ps1 -expirationdate 31.01.2019
195:License expires in 195 day(s).
PS P:\ps1> .\datespam.ps1 -expirationdate 31.02.2019
New-TimeSpan : Der Parameter "End" kann nicht gebunden werden. Der Wert "31.02.2019" kann nicht in den Typ  
"System.DateTime" konvertiert werden. Fehler: "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."  
In P:\ps1\datespam.ps1:3 Zeichen:65
+ $DateDifference = New-TimeSpan -Start (Get-Date -format d) -End $ExpirationDate
+                                                                 ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-TimeSpan], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.NewTimeSpanCommand

0:License expired for  days!
PS P:\ps1>

Edit: Jetzt ahne ich was: Gibst Du vielleicht das so ein?
skript.ps1 -expirationdate=31.01.2019

Liebe Grüße

Erik
Member: colinardo
colinardo Jul 20, 2018 updated at 13:10:06 (UTC)
Goto Top
Dann liegt das Problem wohl bei der Eingabe des Datums.
Die Lösung für sein Problem steht in meinem ersten Post ==> das Gleicheitszeichen in seiner Parameterangabe beim Aufruf ist der Stein des Anstoßes face-wink.
Member: erikro
erikro Jul 20, 2018 at 13:10:27 (UTC)
Goto Top
Zitat von @colinardo:

Dann liegt das Problem wohl bei der Eingabe des Datums.
Die Lösung für sein Problem steht in meinem ersten Post ==> das Gleicheitszeichen in seiner Parameterangabe beim Aufruf ist der Stein des Anstoßes face-wink.

Den habe ich jetzt übersehen. face-wink
Member: MarciMarc85
MarciMarc85 Jul 23, 2018 at 04:53:26 (UTC)
Goto Top
Guten Morgen,

Ichhabe das Script jetzt grundsätzlich schonla so hinbekommen, dass es tut, was es soll und den Restwert der Tage, bis zu einem bestimmten Enddatum ausgibt, sodass das Monitoring es anzeigt. War dann doch leichter, als gedacht:

Param([string]$ExpirationDate)

$DateDifference = new-timespan -end (get-date -format d 31.01.2019)
$Days = $DateDifference.Days 
write-host "<prtg>"  
Write-Host "<result>"  
Write-Host "<channel>Days Left</channel>"  
Write-Host "<value>$($Days)</value>"  
Write-Host "</result>"  
write-host "</prtg>"  

In diesem Fall habe ich das Datum schon im Script eingegeben. Ich könnte es auch als Parameter festlegen und diesen dann beim Script im Sensor mit hinterlegen. Ich fänd es aber besser, wenn das Datum direkt aus der Lizenzdatei ausgelesen wird. Da ist jetzt mein Knackpunkt. die Lizenzdatei laässt sich ganz einfach per Notepad öffnen. Das Ablaufdatum steht (zusammen mit anderen Infos, immer in der 5ten Zeile der Datei und leider auch in einem anderen Format. Lässt sich das irgendwie auslesen und von 31-jan-2019 in 31.01.2019 umwandeln und in dann als Variable als enddatum in das bisherige Script integrieren? Das wäre perfekt!

So sieht das dann (gekürzt) in der Lizenz aus:

  1. Server License
SERVER-MySQL.test.local DISK_SERIAL_NUM=31cb6d
VENDOR RMCON
  1. Programm MultiUserServer
FEATURE MultiUserServer 12.9 31-jan-2019 40 \
VENDOR_STRING=TfL_Test_Server_MySQL.test.local_V12 \
START=3-Jul-2018 SIGN="1730 220D 6BD9 35BC 28B6 6FAB E82A 2AD6 \
36B1 43B0 41A2 5CA3 24A8 A891 B878 0906 F121 BAB7 F69A 35DF \
15F6 BA95 5BF7 8220 9C0A F2A7 C060 C325 FEB9 41F2"
Member: colinardo
colinardo Jul 23, 2018 updated at 05:26:05 (UTC)
Goto Top
Bidde, das Format lässt sich aber auch direkt nutzen
$enddate = [datetime]::parse(([regex]::match((gc 'c:\licensefile.txt' -TotalCount 5)[-1],'\d{1,2}-[a-z]{3}-\d{4}').Value),[cultureinfo]'en')  
Member: MarciMarc85
MarciMarc85 Jul 23, 2018 at 05:35:10 (UTC)
Goto Top
Hi. erstmal danke für Deine Antwort. Die richtige Zeile scheint aber die 4.te zu sein. Die 1. wird scheinbar irgendwie ignoriert.
Mit folgendem Aufruf, hab ich es mittlerweile geschafft, das Datum zu extrahieren

$input = (Get-Content -path "D:\temp\*.lic")[4]  

foreach ($temp in $input)
{
    $ablaufdatum = $Inhalttrennen[4]
 
    $Ausgabe = "$($ablaufdatum) "   
    $Ausgabe
}

Heraus kommt dann "31-jan-2019"

Das Datum muss dann nur in 31.01.2019 umformatiert werden.

Dass muss aber auch funktionieren, wenn dort feb,mar,apr,etc. steht
Member: colinardo
colinardo Jul 23, 2018 updated at 05:40:01 (UTC)
Goto Top
Ändere einfach an meinem Skript den Parameter TotalCount auf 4 wenn es die vierte Zeile ist und fertig! Umwandeln brauchst du dort gar nichts denn das Format wird durch Verwendung der Culture 'en' automatisch erkannt da es ein gültiges Datumsformat ist!
Du brauchst keinen String nach xx.xx.yyyy sondern nur ein Date-Object!
Member: MarciMarc85
MarciMarc85 Jul 23, 2018 at 05:39:13 (UTC)
Goto Top
colinardo, deine Lösung klappt bestens !!! Vielen Dank dafür !
Member: colinardo
colinardo Jul 23, 2018 at 05:41:17 (UTC)
Goto Top
Kein Problem, wenns das dann war noch ein gelöst an den Beitrag und alle sind glücklich.
Member: MarciMarc85
MarciMarc85 Jul 23, 2018 at 12:09:43 (UTC)
Goto Top
Vielleicht noch eine Kleinigkeit:

Ich muss noch als Parameter, beim Scriptaufruf, einen Pfad auf einem anderen Server angeben und muss dazu Credentials mit angeben. wie mache ich das denn am einfachsten?Ich möchte kein Laufwerk mappen, sondern mich einfach nur mit 192.168.0.1\d$ verbinden und username und password mitgeben.
Member: erikro
erikro Jul 23, 2018 at 12:17:38 (UTC)
Goto Top