BAT to EXE

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: BAT to EXE

Beitrag von Danilo »

Coder Pinhead hat geschrieben:Verstehe das mit ProgramExitCode() und End errorlevel in dem fall nicht so ganz wie ich das einbringen kann bzw so wie ich es gerade mal ausprobiert hatte wahrscheinlich falsch hatte es das Programm direkt nach dem ausführen beendet ohne die Sprünge zu berücksichtigen.
Entschuldige bitte, das "..." in der 2. Zeile mußte man noch mit WaitProgram() ersetzen.
Und OpenConsole() hinzufügen.

Code: Alles auswählen

If OpenConsole()

    Program = RunProgram("calc.exe","","",#PB_Program_Open)
    WaitProgram(Program)
    errorlevel = ProgramExitCode(Program)
    CloseProgram(Program)
    
    If errorlevel
      Print("Fehler")
    Else
      Print("Kein Fehler")
    EndIf

    Input() ; auf input warten, sonst schliesst sich doch die konsole gleich wieder!
    
    End 12 ; gib errorlevel 12 zurück

EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: BAT to EXE

Beitrag von Coder Pinhead »

Danke an alle. :allright:

Schade das sich das nicht ganz so simpel Lösen lest. Dafür habe ich wieder ein paar Sachen dazu gelernt. Das ganze war auch mehr oder weniger dazu gedacht was neues zu lernen und um gleichzeitig wieder in PureBasic richtig einzusteigen.

Werde wohl wieder ethliche Tutorials abarbeiten müssen und mir die Hilfe und diverse Code-Snippets zu Herzen nehmen müssen. :mrgreen:
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: BAT to EXE

Beitrag von Falko »

hattest du das mit den errorlevel hier nicht ausprobiert? :roll:

Code: Alles auswählen

ImportC "msvcrt.lib"
  system(cmd.p-ascii)
EndImport

If OpenConsole()
  system("@echo off")
  system("title Test Batch")
  system("ren %USERPROFILE%\Desktop\irgendeinedatei.exe "+Chr(34)+"backup%date%.exe"+Chr(34)+"2>NUL >NUL")
  Goto springe;system("goto springe"); Sprünge dann direkt in PB mit Goto
  system("echo hallo"); dieses Echo wird aufgrund des Sprungs nicht ausgeführt.
  springe: ; Sprungmarken am Besten als PB-Befehl einbauen.
  system("echo gesprungen")
  Debug %errorlevel%
  system("if %errorlevel% == 0 (echo Kein Fehler)")
  system("if %errorlevel% == 0 (call notepad.exe)"); nur mal so als Test
  system("if %errorlevel% == 1 (echo Fehler)")
  system("pause")

  CloseConsole()
EndIf
Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: BAT to EXE

Beitrag von Coder Pinhead »

Falko hat geschrieben:hattest du das mit den errorlevel hier nicht ausprobiert? :roll:
Klar, nur kann man so nur eine externe Anwendungen öffnen und nicht zu einer bestimmten Zeile springen die über mehren Zeilen hinweg sagt was schief gelaufen ist.

EDIT
Und als Fehlermeldung scheint es mit meiner Batch auch nicht richtig zu laufen da es da er mir immer eine falsche Meldung raus gibt. Also egal ob die Aktion richtig oder falsch war er sagt entweder Fehler oder Richtig je nachdem wo ich die 1 oder 0 drinnen stehen hab.
EDIT ENDE

Ach und Debug %errorlevel% funktioniert so indem Fall nicht.
Zeile 13: Keine gültige Binär-Zahl.


Noch was gehört zwar nicht zum aktuellen Thema.
Aber kann mir wer ein aktuelles Tutorium was 4.5x Kompatibel ist empfehlen damit ich wieder schnell in PureBasic einsteigen kann? :)
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: BAT to EXE

Beitrag von Danilo »

Falko hat geschrieben:hattest du das mit den errorlevel hier nicht ausprobiert? :roll:

Code: Alles auswählen

ImportC "msvcrt.lib"
  system(cmd.p-ascii)
EndImport

If OpenConsole()
  system("@echo off")
  system("title Test Batch")
  system("ren %USERPROFILE%\Desktop\irgendeinedatei.exe "+Chr(34)+"backup%date%.exe"+Chr(34)+"2>NUL >NUL")
  Goto springe;system("goto springe"); Sprünge dann direkt in PB mit Goto
  system("echo hallo"); dieses Echo wird aufgrund des Sprungs nicht ausgeführt.
  springe: ; Sprungmarken am Besten als PB-Befehl einbauen.
  system("echo gesprungen")
  Debug %errorlevel%
  system("if %errorlevel% == 0 (echo Kein Fehler)")
  system("if %errorlevel% == 0 (call notepad.exe)"); nur mal so als Test
  system("if %errorlevel% == 1 (echo Fehler)")
  system("pause")

  CloseConsole()
EndIf
Gruß Falko
Falko, Du bist doch nun auch schon länger dabei.

Atme ein paar mal ruhig und tief ein und aus, bis Du ganz relaxed
und ruhig wirst. Ganz tief, ein und aus. Und dann geh kurz in Dich,
und frag Dich mal ob das überhaupt alles einen Sinn macht mit dem
system() und .BAT gezappel.

Wie einige Kollegen schon anmerkten, ist das doch eigentlich totaler Schwachsinn, oder?
Davon bekommt man imo glatt Augenkrebs! Das ist doch eine Vergewaltigung einer
kompilierten Programmiersprache! Das hat ja nix mit Scripting zu tun, welches noch den
Vorteil hätte, daß man das Script jederzeit ändern könnte, ohne die Anwendung
neu kompilieren zu müssen. Wenn jemand mit PB programmieren möchte, aber nur
Pascal kann, dann schreibst Du doch auch keinen Pascal-Interpreter, so daß derjenige
seine Pascal-Codes mit PB ausführen kann.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: BAT to EXE

Beitrag von Falko »

@Danilo, damit habe ich schon gerechnet! :wink:
Um deine Augen zu schonen habe ich das mal in PB-Console und API umgeschrieben :wink:
So kann man Errorcodes auch ohne das Runprogramm() ausgeben.
Interessant ist, das ich die Datei trotzdem umbenennen konnte, es trotzdem eine Fehlermeldung gibt.
Aber vielleicht weist du mehr darüber. :allright:

Gruß, Falko

Nun eine Consoleanwendung mit PB und etwas API:
Sprünge sind somit dann auch rein mit goto und Sprungmarke:
möglich. Sogar auf bestimmte Fehler, die man dann an den jeweiligen
Sprungmarken ausgeben möchte.

Code: Alles auswählen

; Fehlerausgabe in Text, codeschnipsel von mk-soft
Procedure.s FormatMessage(ErrorNumber.l)

  Protected *Buffer, len, result.s
 
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorNumber,0,@*Buffer,0,0)
  If len
    result = PeekS(*Buffer, len - 2)
    LocalFree_(*Buffer)
    ProcedureReturn result
  Else
    ProcedureReturn "Errorcode: " + Hex(ErrorNumber)
  EndIf
 
EndProcedure

Procedure MoveFile(Filename.s,NewPath.s)
  If FileSize(Filename)>0
    CopyFile(Filename,NewPath+"\"+GetFilePart(Filename))
    DeleteFile(Filename)
  Else
    MessageRequester("Warnung","Die Datei ist nicht vorhanden!")
  EndIf
EndProcedure

OpenConsole()
  Path.s=GetEnvironmentVariable("USERPROFILE")+"\Desktop\"
  ConsoleTitle("Test Batch")
  If CheckFilename("irgendeinedatei.exe")
    PrintN("Warum die Originalfile wie folgt umbennen?")
    RenameFile(Path+"irgendeinedatei.exe",Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe")
    PrintN("Ich würde empfehlen, sie gleich mit einem neuen Namen zu kopieren")
    CopyFile(Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe",Path+"irgendeinedatei.exe")
    PrintN("Und das Backup in einen Ordner kopieren")
    If FileSize(Path+"NeuBackup")= -2
      MessageRequester("Warnung!","Es ist schon ein Ordner vorhanden")
    Else
      CreateDirectory(Path+"NeuBackup")
    EndIf
    MoveFile(Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe",Path+"NeuBackup")
  EndIf  
  PrintN("hallo")
  Print("Druecken sie irgendeine Taste....")
  Input()
  MessageRequester("LastError","Fehlercode: " +Str(GetLastError_())+#CRLF$+FormatMessage(GetLastError_()))
CloseConsole()

[Edit]
Habe den Fehler der Fehlermeldung gefunden, die wie folgt kam:
Messagebox hat geschrieben:---------------------------
LastError
---------------------------
Fehlercode: 5

Zugriff verweigert
---------------------------
OK
---------------------------
Dieses kommt nur, weil der debugger eingeschaltet war. Sobald ich den aus habe, kommt der korrekte
Fehlercode: 0 heraus.

Bei erneuten Start, kommt auch der korrekte Fehlercode: 2 heraus.

Dann viel Spass beim Weiterprogen, Jungs.
[/Edit]
[Edit2]
Habe den PB-Source mit weiteren Zeilen erweitert
Dies ist keine BAT-Datei !!!
[/Edit2]
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: BAT to EXE

Beitrag von Bisonte »

Was soll die besagte .bat Datei denn alles anstellen, das es nicht möglich wäre, es simpel in PB zu machen ?

Ich mag etwas alt und verschränkt sein, aber es leuchtet mir einfach nicht ein, warum so an der Batch Skripterei festgeklammert wird.

Man möge mich erleuchten.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: BAT to EXE

Beitrag von rolaf »

Bisonte hat geschrieben:Man möge mich erleuchten.
Hier gleich ne ganze Dose.
Aber nicht alles auf einmal futtern. :lol:

Bild
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: BAT to EXE

Beitrag von Coder Pinhead »

Falko hat geschrieben:

Code: Alles auswählen

; Fehlerausgabe in Text, codeschnipsel von mk-soft
Procedure.s FormatMessage(ErrorNumber.l)

  Protected *Buffer, len, result.s
 
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorNumber,0,@*Buffer,0,0)
  If len
    result = PeekS(*Buffer, len - 2)
    LocalFree_(*Buffer)
    ProcedureReturn result
  Else
    ProcedureReturn "Errorcode: " + Hex(ErrorNumber)
  EndIf
 
EndProcedure

Procedure MoveFile(Filename.s,NewPath.s)
  If FileSize(Filename)>0
    CopyFile(Filename,NewPath+"\"+GetFilePart(Filename))
    DeleteFile(Filename)
  Else
    MessageRequester("Warnung","Die Datei ist nicht vorhanden!")
  EndIf
EndProcedure

OpenConsole()
  Path.s=GetEnvironmentVariable("USERPROFILE")+"\Desktop\"
  ConsoleTitle("Test Batch")
  If CheckFilename("irgendeinedatei.exe")
    PrintN("Warum die Originalfile wie folgt umbennen?")
    RenameFile(Path+"irgendeinedatei.exe",Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe")
    PrintN("Ich würde empfehlen, sie gleich mit einem neuen Namen zu kopieren")
    CopyFile(Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe",Path+"irgendeinedatei.exe")
    PrintN("Und das Backup in einen Ordner kopieren")
    If FileSize(Path+"NeuBackup")= -2
      MessageRequester("Warnung!","Es ist schon ein Ordner vorhanden")
    Else
      CreateDirectory(Path+"NeuBackup")
    EndIf
    MoveFile(Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe",Path+"NeuBackup")
  EndIf  
  PrintN("hallo")
  Print("Druecken sie irgendeine Taste....")
  Input()
  MessageRequester("LastError","Fehlercode: " +Str(GetLastError_())+#CRLF$+FormatMessage(GetLastError_()))
CloseConsole()
In großen und ganzen verstehe ich den Sourcecode nur ich hätte da halt noch eine Frage. Da wir hier ja eh schon bei Konsolenanwendungen angelangt sind stell ich die hier mal mit dazu. Und zwar wie kann man eine Datei Überprüfen bzw. Verschieben die keinen festen Namen hat. Kurz gesagt wie kann ich *Wildecards mit dem folgenden Befehlen verwenden?

CheckFilename("datei *.dat")
CopyFile(Ordner+"datei *.dat",Desktop+"dateibackup.dat")

Habe auch schon in der WinAPI nach einer Lösung gesucht und habe zwar was gefunden aber damit geht es auch nicht.

CopyFile_("%USERPROFILE%\AppData\ORDNER\datei*.dat", "%USERPROFILE%\AppData\Desktop\dateibackup.dat", 0)

EDIT:
So hab es gelöst und zwar über ExamineDirectory
Wenn es aber noch andere Möglichkeiten geben sollte immer her damit :).
EDIT ENDE:
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: BAT to EXE

Beitrag von Falko »

Wie wäre es hiermit?

Code: Alles auswählen

Zaehler.l=0
  If ExamineDirectory(0, "", "*.txt") 
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        Type$ = " [File] "
        CopyFile(DirectoryEntryName(0),"dateibackup"+Str(Zaehler)+".dat")
        Zaehler+1
      Else
        Type$ = " [Sub-Dir] "
      EndIf
      
      Debug DirectoryEntryName(0) + Type$ + "- Größe in Bytes: " + Str(DirectoryEntrySize(0))
    Wend
    FinishDirectory(0)
  EndIf
[Edit]
habe gerade gesehen, das du es gelöst hattest. Lasse den Code aber trotzdem hier
mal stehen. Und das ganze nochmal in eine Procedure umgeschrieben.

Code: Alles auswählen

; Fehlerausgabe in Text, Codeschnipsel von mk-soft

Global Path.s=GetEnvironmentVariable("USERPROFILE")+"\Desktop\"
Global Path1.s=GetEnvironmentVariable("USERPROFILE")+"\AppData\Roaming\PureBasic\"


Procedure.s FormatMessage(ErrorNumber.l)

  Protected *Buffer, len, result.s
 
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorNumber,0,@*Buffer,0,0)
  If len
    result = PeekS(*Buffer, len - 2)
    LocalFree_(*Buffer)
    ProcedureReturn result
  Else
    ProcedureReturn "Errorcode: " + Hex(ErrorNumber)
  EndIf
 
EndProcedure

Procedure MoveFile(Filename.s,NewPath.s)
  If FileSize(Filename)>0
    CopyFile(Filename,NewPath+"\"+GetFilePart(Filename))
    DeleteFile(Filename)
  Else
    MessageRequester("Warnung","Die Datei ist nicht vorhanden!")
  EndIf
EndProcedure

Procedure.l _CopyFilename(Verzeichnis.s,Datei.s)
  Zaehler.l=0
  If ExamineDirectory(0, Verzeichnis, Datei) 
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        ;CopyFile(DirectoryEntryName(0),"dateibackup"+Str(Zaehler)+".dat")
        CopyFile(Path1+DirectoryEntryName(0),Path+"NeuBackup\dateibackup"+Str(Zaehler)+".prefs")        
        PrintN(DirectoryEntryName(0))
        Zaehler+1
      EndIf
    Wend
    ProcedureReturn i
    FinishDirectory(0)
EndIf

EndProcedure
 
OpenConsole()
  ConsoleTitle("Test Batch")
  If CheckFilename("irgendeinedatei.exe")
    PrintN("Warum die Originalfile wie folgt umbennen?")
    RenameFile(Path+"irgendeinedatei.exe",Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe")
    PrintN("Ich würde empfehlen, sie gleich mit einem neuen Namen zu kopieren")
    CopyFile(Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe",Path+"irgendeinedatei.exe")
    PrintN("Und das Backup in einen Ordner kopieren")
    If FileSize(Path+"NeuBackup")= -2
      MessageRequester("Warnung!","Es ist schon ein Ordner vorhanden")
    Else
      CreateDirectory(Path+"NeuBackup")
    EndIf
    MoveFile(Path+"Backup"+FormatDate("%dd.%mm.%yyyy",Date())+".exe",Path+"NeuBackup")
  EndIf  
  _CopyFilename(Path1,"*.prefs")
  PrintN("")
  PrintN("hallo")
  Print("Druecken sie irgendeine Taste....")
  Input()
  MessageRequester("LastError","Fehlercode: " +Str(GetLastError_())+#CRLF$+FormatMessage(GetLastError_()))
CloseConsole()
[/Edit]



Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten