Batchprogrammierung, if %date% größer als %Maxdate% erstellen?
Hallo, ich würde gerne wissen wie ich in Batch eine if größer als machen kann. Bsp.:
if %date%==%Maxdate% goto lizenzabgelaufen
dann ist es an dem Tag nur abgelaufen wo das Datum übereinstimmt.
Ich möchte aber das es auch die Tage/monate danach nicht geht.
BILD VOM CODE : https://cdn.discordapp.com/attachments/696399697547624539/708682994965020672/unknown.png
2 Antworten
In Batch hast du neben "==" noch folgende Vergleichsoperatoren zur Verfügung:
EQU - gleich
NEQ - nicht gleich
LSS - kleiner als
LEQ - kleiner als oder gleich
GTR - größer als
GEQ - größer als oder gleich
Also um zwei Zahlen zu vergleichen:
set /a a = 5
set /a b = 7
if %a% leq %b% (
echo a ist kleiner als oder gleich b
)
Beim Datum allerdings hast du das Problem, dass du meist keine Zahlen, sondern Strings in einem bestimmten Datumsformat vorliegen hast.
Das Datumsformat von %date% kann zudem auf unterschiedlichen Computern variieren. Darum ist es besser das Datum mit z.B. `wmic os get LocalDateTime /VALUE` abzufragen. Das speichern dieses Wertes kannst du mit for erledigen:
for /f "tokens=1,2 delims==" %%d in ('wmic os get LocalDateTime /VALUE') do (if "%%d" equ "LocalDateTime" set dt=%%e)
Da du dich beim Datum nur für die ersten 8 Stellen interessierst, kannst du den Rest abschneiden; Ich füge zudem gerne zwischen Jahr, Monat und Tag noch Striche "-" ein, damit das Datum besser lesbar ist:
set currentDate=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%
Mit `if` kannst du nun einen Stringvergleich mit einem anderen Datum (im selben Format) durchführen:
if "%currentDate%" gtr "%maxDate%" goto licenseExpired
Hier mal ein ganzes Beispielprogramm:
for /f "tokens=1,2 delims==" %%d in ('wmic os get LocalDateTime /VALUE') do (if "%%d" equ "LocalDateTime" set dt=%%e)
:: dateFormat:= YYYY - MM - DD
set currentDate=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%
set maxDate=2020-05-10
if "%currentDate%" gtr "%maxDate%" goto licenseExpired
echo passed.
pause&exit
:licenseExpired
echo error. license expired.
pause&exit
ein bat script kann man nicht unlesbar machen oder ?
Nein. Du kannst nah an Unlesbarkeit herankommen, indem du die Batch in einen .exe-Wrapper packst, den Code schwer lesbar machst und das Datum nicht allzu leicht verändern lässt. Allerdings erhöhst du damit nur den Zeitaufwand, die eine Person braucht, um die Batch zu "lesen"; unmöglich wird es nie werden.
Programmiere in VBS (Visual Basic Script)
Beispiel (also test.vbs abspeichern und doppeltklicken)
if NOW > CDate("11.05.2020") then
MsgBox "abgelaufen"
End if
um das zu testen setze dann statt 11.05. eben 08.05 usw ein. (es wird übrigens 00:00:00 Uhr genommen .. wenn du den ganzen tag haben willst müsstest du CDate("12.05.2020") oder CDate("11.05.2020 23:59:59") nehmen. Letzteres macht wegen einer Sekunde nicht soviel sinn.
das ganze in VBS umformulieren, dann hast du mehr Möglichkeiten.
du kannst auch ein cmd oder bat innerhalb eines VBS aufrufen. mit ShellExecute ... google danach.
Warum sollte er das ganze in vbs umformulieren, nur weil du dich da besser auskennst?
DAS IST DER CODE
@echo off
:Start
color 0a
title Hooker Script
cls
echo.
echo ===============================================================================
echo = SCRIPT MASTER =
echo ===============================================================================
echo.
echo.
echo.
set Maxdate=10.05.2020
:KeyPass
set /p Name=Wie lautet Ihr Name?
if %Name%==XXX goto Lizenz
exit
:Lizenz
set /p Key=Lizenz:
if %Key%==XXX goto keytrue
echo Key is not registerd
echo.
echo.
goto KeyPass
:; ping -n 2 127.0.0.1>NUL
exit
:keytrue
if %date%==%Maxdate% goto invalidlicense
...
:invalidlicense
color 0b
title %Name% %Key% %Date% Lizenz abgelaufen
echo:
echo:
echo Deine Lizenz ist abgelaufen am %Maxdate%.
echo Kontaktiere den Entwickler, wenn du Sie weiter nutzen möchtest.
echo:
echo:
pause
exit
danke :D ein bat script kann man nicht unlesbar machen oder ?
Da ich ungerne möchte das man einfach das %maxdate% umstellen kann.
Würde ich es per Datenbank machen, könnte man ja die Daten rauslesen ^^.
Oder kann ich das über ein Web machen, wie z.B. bei Pastebin.
in C# habe ich das so gemacht :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class gameversion : MonoBehaviour
{
public string URL = "";
public string CurVersion;
string latestVersion;
public GameObject newVersionAvailable;
private void Start()
{
StartCoroutine(LoadTxtData(URL));
}
public void CheckVersion()
{
if(CurVersion != latestVersion)
{
newVersionAvailable.SetActive(true);
}
else
{
newVersionAvailable.SetActive(false);
}
Debug.Log("Cur Version: " + CurVersion + " Latest Version: " + latestVersion);
}
IEnumerator LoadTxtData(string url)
{
WWW www = new WWW(url);
yield return www;
latestVersion = www.text;
CheckVersion();
}
public void OpenURL(string url)
{
Application.OpenURL(url);
}
}