• Hallo an alle

    Local $foo = RunWait("C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username "postgres" --no-password --format custom --blobs --verbose --file c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup "asv")

    was mache ich falsch ????? ?(

  • Sollte nen Syntaxerror geben, da das kein String ist.
    RunWait('"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username "postgres" --no-password --format custom --blobs --verbose --file c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup "asv"')
    Sollte besser gehen. Was die Parameter angeht: ich kenn das Programm nicht.

  • AutoIt
    Local $cmd = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup asv'
    ConsoleWrite($cmd & @CRLF)
    Local $foo = RunWait($cmd)

    Der letzte Parameter "asv" macht so allerdings keinen Sinn... weil --file hier einen Dateinamen erwartet - und der endet nach .backup.

    Wenn du das "asv" als Dateieindung verwenden willst, sollte die Zeile so aussehen...

    AutoIt
    Local $cmd = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup.asv'
    ConsoleWrite($cmd & @CRLF)
    Local $foo = RunWait($cmd)

    Solltes du jedoch den Dateinamen so ".backup asv" enden lassen wollen, muss der komplette Name in Quote gesetzt werden... was allerdings sehr unfein wäre...

    AutoIt
    Local $cmd = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file "c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup asv"'
    ConsoleWrite($cmd & @CRLF)
    Local $foo = RunWait($cmd)

    2 Mal editiert, zuletzt von Bitnugger (5. August 2016 um 02:15)

  • Danke Danke das asv am Ende muss sein da es die datenbank anspricht.

    in der Batch sieht es so aus

    set PGPASSWORD=12345

    "C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username "postgres" --no-password --format custom --blobs --verbose --file c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup "asv"

    set PGPASSWORD=null

    und das Funktioniert einwandfrei, wie kann ich diese drei Befehle der cmd.exe übergeben das es funktioniert wenn ich es jetzt mit deinem Script ausführe geht ganz kurz die cmd auf und schließt sich gleich wieder aber es passiert nichts.

    hast du vielleicht noch eine IDEE ?

  • meine jetzige Funktion (ohne Erfolg)

    Func _ConsoleDir()
    Local $pass = 'set PGPASSWORD=' & $password
    ConsoleWrite($pass & @CRLF)
    Local $cmd = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username "postgres" --no-password --format custom --blobs --verbose --file c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup' & " " &'"asv"'
    ConsoleWrite($cmd & @CRLF)

    Local $foo = RunWait($cmd)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    GUICtrlSetData($nEdit, $line & @CRLF, 'append')
    WEnd
    EndFunc

  • Local $pass = 'set PGPASSWORD=' & $password
    ConsoleWrite($pass & @CRLF)

    Das macht null Sinn, weil du bei RunWait() den Parameter --no-password angibst - der pg_dump.exe wird also gesagt, dass KEIN Passwort benötigt wird...

    Ich denke der korrekte Parameter in diesem Fall wäre...

    Local $pass = 12345
    ...pg_dump.exe --password $pass ...

    Und Runwait() macht auch keinen Sinn... wir wollen ja nicht warten, bis der Befehl fertig ist und sich beendet hat, sondern wir wollen die Ausgabe des Befehls quasi "LIVE" mitschneiden.

    Wenn ich nicht total panne bin, hast du wegen dieser Frage noch einen Tread laufen, in dem ich dir geantwortet habe... hier das Script in leicht abgeänderter Form, wobei hier das 'asv' als zusätzlicher Parameter hinter dem Dateinamen angehangen wird. Teste das Script mal und zeige uns, was du dann als Ausgabe angezeigt bekommst, wenn es NICHT funktioniert.

    Spoiler anzeigen

    Nachtrag: Hier steht es... falls ein Passwort gesetzt und verwendet werden soll, wird es in der Datei .pgpass erwartet.

    -w
    --no-password Never issue a password prompt. If the server requires password authentication and a password is not available by other means such as a .pgpass file, the connection attempt will fail. This option can be useful in batch jobs and scripts where no user is present to enter a password.
    -W
    --password Force pg_dump to prompt for a password before connecting to a database.
    This option is never essential, since pg_dump will automatically prompt for a password if the server demands password authentication. However, pg_dump will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.


    Wie diese Datei aufgebaut sein muss, wird hier beschrieben: https://www.postgresql.org/docs/9.3/static/libpq-pgpass.html

    In dem Fall ist der Parameter --no-password dann doch korrekt - doch das Passwort, wenn eines benötigt wird, muss dann in der Datei .pgpass stehen.

    Alternativ, so wie du es angedacht hattest, via Umbebungsvariable...

    31.13. Environment Variables

    PGPASSWORD behaves the same as the password connection parameter. Use of this environment variable is not recommended for security reasons, as some operating systems allow non-root users to see process environment variables via ps; instead consider using the ~/.pgpass file (see Section 31.14).

    Habe das Script nun entsprechend angepasst...


    Im Anhang auch noch mal eine geänderte Version deiner Batch mit ein paar Kommentaren dazu...

  • Hallo :)

    erstmal ein herzliches Dankeschön für die Ausführliche Hilfe die du mir zukommen lässt bin überwältigt. Ich habe es jetzt mal gestartet und es kommt folgende Ausgabe

    mehr hat sich bis jetzt nicht getan.
    Mache ich noch was falsch ?

  • PostgreSQL_ERR_Backup.png

    Die obige grün markierte Ausgabe habe ich mit diesem Script hier bekommen... die $iPID darf nicht 0 sein... versuche es noch mal mit diesem Script - und auch mal den "Inhalt von Laufwerk C: anzeigen" anklicken!

    Spoiler anzeigen
  • Hi ja jetzt ist es genau so wie bei dir in der grünen Sprechblase der Pfad stimmt zu 100% aber er findet ihn nicht keine Ahnung warum

    Hier der Pfad auf meinem PC stimmt

    und das ist es wenn ich das Programm ausführe, mann ist das alles kompliziert. ;(

  • Oh backe, das ist ja mal ein saudummer Fehler von mir... :cursing:

    AutoIt
    Local $sPG_DUMP  = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe"'
    	Local $sFileName = "c:\asv\sicherung\asv_" & StringReplace(_NowCalcDate(), '/', '_') & ".backup"
    	Local $sCMD = $sPG_DUMP & ' --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file "' & $sFileName & '" asv'
    	_WriteLog('Backup Befehl: ', $sCMD)
    	If FileExists($sPG_DUMP) = 0 Then
    		_WriteLog('Fatal Error: ', 'Das Program ' & $sPG_DUMP & 'konnte nicht gefunden werden!')
    		Return SetError(1, 0, $sPG_DUMP)
    	EndIf


    Zeile 53: Local $sPG_DUMP = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" '

    Dass der Befehl nicht gefunden wird, liegt sicher an dem Leerzeichen am Ende der Zeile --> .exe" '

    Ich habe die Zeilen 53 und 55 im Script aus Post #7 nun korrigiert... jetzt sollte es aber funktionieren!

  • Hi

    Also ich habe es versucht da bringt er immer noch den gleichen Fehler

    Zeile 53 habe ich einfach mal so geändert
    Local $sPG_DUMP = "C:\Programme\PostgreSQL\9.5\bin\pg_dump.exe"

    dann macht er das Backup aber er schreibt nichts in $idEdit_Log als Ausgabe und das Programm stürzt mit einer Fehlermeldung ab.

    Das Backup wird aber so erzeugt komisch

    Wie kann man es noch machen das es nicht abstürzt und die Ausgabe in $idEdit_Log schreibt ?


    danke du bist echt klasse

  • Local $sPG_DUMP = "C:\Programme\PostgreSQL\9.5\bin\pg_dump.exe"

    "Programme" ist lediglich ist ein Hardlink, der auf "Program Files" verweist... so hast du natürlich keine Leerzeichen im Pfad und musst es daher auch nicht doppelt in Quote packen. Allerdings besteht hierbei die Gefahr, dass dein Script auf anderssprachigen Systemen ins Leere läuft, da es dort kein "Programme" gibt! Ich schaue mir das noch mal in aller Ruhe an und teste es mal anhand einiger Befehle, die ich hier verfügbar habe. Doch jetzt muss ich erst mal mein Windows neu aufsetzen, das mir mein Feund zerschossen hat... melde mich dann morgen im Laufe des Tages.

    dann macht er das Backup aber er schreibt nichts in $idEdit_Log als Ausgabe und das Programm stürzt mit einer Fehlermeldung ab.

    $idEdit_Log??? - und welche Fehlermeldung es war, soll mir dann wohl meine Glaskugel sagen, oder wie? ;)

  • Hier stürzt nicht das Script ab, sondern AutoIt... welches Script (poste es mal hier, wenn es von mir war und du daran etwas geändert hast) hast du denn wie in AutoIt gestartet? Hast du es einfach mit F5 ausgeführt, oder die kompilierte Exe gestartet? Welche Version von AutoIt hast du installiert? Welches Betriebssystem hast du, welche Version? Startest du das Script als 64-bit, oder32-bit?

    $idEdit_Log - wo ist denn diese Variable definiert und wie oder wo werden die Daten übergeben bzw. gespeichert?

  • Hi

    Sorry das ich mich wieder melde es geht um das Script was du am Samstag, 13:11 gepostet hast

    • #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    • #AutoIt3Wrapper_Change2CUI=y
    • #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    • #Region ;************ Includes ************
    • #Include <EditConstants.au3>
    • #Include <GUIConstantsEx.au3>
    • #include <Date.au3>
    • #include <WinAPIMisc.au3>
    • #EndRegion ;************ Includes ************
    • ;-- TIME_STAMP 2016-08-06 12:43:28
    • Opt('MustDeclareVars', 1)
    • #Region - ;************ GUI Create **********
    • GUICreate('Backup', 1280, 360)
    • Local $idButton_DirC = GUICtrlCreateButton('Inhalt von Laufwerk C: anzeigen', 10, 320, 420, 32)
    • Local $idButton_Backup = GUICtrlCreateButton('Backup starten', 430, 320, 420, 32)
    • Local $idButton_Exit = GUICtrlCreateButton('Programm beenden',850, 320, 420, 32)
    • Local $idEdit_Log = GUICtrlCreateEdit('', 10, 10, 1260, 300, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    • GUISetState()
    • _WriteLog('Backup Programm Start: ', _NowDate() & ' - ' & _NowTime())
    • #EndRegion ;************ GUI Create **********
    • #Region - ;************ GUI SelectLoop ******
    • While 1
    • Switch GUIGetMsg()
    • Case $GUI_EVENT_CLOSE, $idButton_Exit
    • Exit
    • Case $idButton_DirC
    • _DirC()
    • Case $idButton_Backup
    • _Backup()
    • EndSwitch
    • WEnd
    • #EndRegion ;************ GUI SelectLoop ******
    • Exit
    • Func _DirC()
    • _WriteLog('Inhalt von Laufwerk ', 'C: anzeigen...')
    • Local $iPID = Run(@ComSpec & " /c " & "Dir C:", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    • _WriteOutputToLog($iPID)
    • EndFunc
    • Func _Backup()
    • ; Passwort in Umgebungsvariable für PostgreSQL setzen - Paswort evtl. korrigieren
    • EnvSet('PGPASSWORD', '12345')
    • ; EnvUpdate() ; hier mal auskommentieren, wenn Fehler...
    • Local $sPG_DUMP = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" '
    • Local $sFileName = "c:\asv\sicherung\asv_" & StringReplace(_NowCalcDate(), '/', '_') & ".backup"
    • Local $sCMD = $sPG_DUMP & '--host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file "' & $sFileName & '" asv'
    • _WriteLog('Backup Befehl: ', $sCMD)
    • If FileExists($sPG_DUMP) = 0 Then
    • _WriteLog('Fatal Error: ', 'Das Program ' & $sPG_DUMP & 'konnte nicht gefunden werden!')
    • Return SetError(1, 0, $sPG_DUMP)
    • EndIf
    • Local $iPID = Run($sCMD, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    • _WriteLog('PG_DUMP.EXE wurde gestartet - ', '$iPID = ' & $iPID)
    • _WriteOutputToLog($iPID)
    • ; Passwort für PostgreSQL wieder löschen
    • EnvSet('PGPASSWORD')
    • EndFunc
    • Func _WriteOutputToLog($iPID)
    • Local $sOutput = ""
    • While 1
    • $sOutput = StdoutRead($iPID)
    • If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
    • ExitLoop
    • EndIf
    • _WriteLog('Stdout Read: ', $sOutput)
    • WEnd
    • While 1
    • $sOutput = StderrRead($iPID)
    • If @error Then ; Exit the loop if the process closes or StderrRead returns an error.
    • ExitLoop
    • EndIf
    • _WriteLog('Stderr Read: ', $sOutput)
    • WEnd
    • EndFunc
    • Func _WriteLog($sPrefix, $sText)
    • If $sText = '' Then Return
    • GUICtrlSetData($idEdit_Log, $sPrefix & _WinAPI_OemToChar($sText) & @CRLF, 1)
    • EndFunc


    Und das steht $idEdit_Log da schreibt er nichts rein stürzt mit einer Fehlermeldung ab siehe letzter Post von mir. Aber das backup wird erstellt, woran kann das liegen ????? hast du eine Ideee ?? :klatschen:

  • hey, hat dir noch niemand hier gesagt, dass deine Art zu posten ziemlich unartig ist?
    Gepostete Scripts gehören in die entsprechenden Tags... In der Toolbar das dritte von rechts. Sieht so aus : </>
    Wenn du da drauf klickst, wählst du da, wo "Keine Hervorhebung" steht "AutoIt" aus und dann kopierst du im unteren Eingabefeld den Scriptcode hinein. und bei längeren Scriptcode sollte man das auch zusätzlich noch in den Spoiler packen.
    Wäre dann in der Toolbar das 2. von rechts...

    Das würde dann so aussehen
  • So... ich habe jetzt noch ein paar Dinge geändert und bin mir nun ziemlich sicher, dass es jetzt funktioniert. :rofl:

    Vorab noch ein paar Infos...

    • Wenn das Script bei dir unkompiliert (*.au3) nicht funktioniert, dann musst du das Script als 64-bit-Anwendung kompilieren und dann die PostgreSQL_DUMP_x64.exe starten. Die dafür nötigen 'Directives' für den AutoIt3Wrapper habe ich bereits gesetzt.
    • Schmiert AutoIt bei dir wieder ab, dann starte das Script mal als Administrator (Als Administrator ausführen via Kontextmenü).
    • Geht es immer noch nicht, dann benenne die c:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe temporär um (pg_dump.exe.bak) und kopiere die pg_dump_test_x64.exe als pg_dump.exe nach c:\Program Files\PostgreSQL\9.5\bin\.
      Wenn die Test-Exe dann nicht abschmiert, hakt es an einer Stelle, an der ich bestenfalls noch mit Teamviewer weiterhelfen könnte.

    Teste mal alle Buttons durch und melde dich dann wieder...

    PostgreSQL_DUMP.au3
    pg_dump_test.au3 (Test-Script)


    PostgreSQL.png

    2 Mal editiert, zuletzt von Bitnugger (10. August 2016 um 01:15)