none
IBM Informix Dynamic Server (IDS) 11.5 / ontape-Datensicherung mit Powershell-Skript RRS feed

  • Frage

  • Hallo liebes Forum,

    ich versuche gerade meine Windows-Shell-Skripte in Powershell-Skripte umzusetzen.
    Darunter ist auch ein Skript, welches u.a. auch zur Sicherung von Informix-Datenbanken dient.

    Die Sicherung wird mit folgender Zeile gestartet:

        "C:\Program Files (x86)\Informix\bin\ontape.exe" -s -L 0 -t "c:\BTest\DB-Sicherung\b1.txt" <"C:\btest\return.txt" -d > "C:\btest\backup.log" 2>&1

    Das Problem an der ganzen Geschichte ist, das ontape nur mit einer Benutzer-Eingabe gestartet werden kann:

        Please mount tape 1 on c:\BTest\DB-Sicherung\b1.txt and press Return to continue ...

    Diese Eingabe kann man mit dem Trick einer Eingabeumlenkung im Skript und einer Datei, die nur ein Return beinhaltet, erreichen.
    Leider wird von Powershell V2.0 diese Eingabeumlenkung (noch) nicht unterstützt und ich habe es auch auf keinem anderen Weg hinbekommen, das die DB-Sicherung

    gestartet wird.

    Leider hat mich auch die Internet-Suche zu keinem Ergebnis geführt.

    Kennt jemand einen Trick, um die Anforderung mit Power-Shell zu lösen?
    Da wir bei unseren Kunden noch mit 2008 R2 Servern arbeiten und ich bei diesen auch nicht immer mal eben schnell die letzte Powershell-Version installieren

    kann, müßte das Skript unter Powershell V2 laufen.

    Gerne kann ich hier auch ein paar Zeilen erfolglose Versuche posten.

    Danke und Grüße
    Sabine
    Donnerstag, 5. März 2015 09:46

Antworten

  • Hallo Sabine!

    Um PowerShell Externe Programme zu starten, empfehle ich dir die Möglichkeiten zu nutzen die ich in dem folgenden Artikel aufgeführt habe:
    Mehrere Arten mit der PowerShell ein externes Programm zu starten

    http://www.admin-source.de/BlogDeu/791/mehrere-arten-mit-der-powershell-ein-externes-programm-zu-starten

    Für dich müsste die Möglichkeit 5. der & Operator Funktionieren.

    # Schreibwiese mit dem & call Operator
    & 'C:\Program Files (x86)\Informix\bin\ontape.exe' @('-s','-L','0','-t','c:\BTest\DB-Sicherung\b1.txt','<C:\btest\return.txt','-d','>','C:\btest\backup.log','2>&1')

    Du kannst auch in PowerShell die :NET System.Diagnostics.Process Klasse in Verbindung mit der .NET System.Diagnostics.ProcessStartInfo Klasse benutzen.

    Hier hast du die maximale Kontrolle über einen Windows-Prozess.

    # Prozess mit der .NET Klasse System.Diagnostics.Process
    # Ungetestet!
    
    $LogFilePath = 'C:\btest\backup.log'
    
    # Prozess startoptionen festlegen
    $ps = New-Object System.Diagnostics.Process
    $ps.StartInfo.Filename = 'C:\Program Files (x86)\Informix\bin\ontape.exe'
    $ps.StartInfo.Arguments = '-s -L 0 -t "c:\BTest\DB-Sicherung\b1.txt" -d'
    $ps.StartInfo.RedirectStandardOutput = $True
    $ps.StartInfo.RedirectStandardError = $True
    $ps.StartInfo.RedirectStandardInput = $True
    $ps.StartInfo.UseShellExecute = $False
    
    # Prozess starten
    $ps.Start()
    
    # input in den Prozess schreiben
    $ps.StandardInput.Write([Char[]]'C:\btest\return.txt')
    $ps.StandardInput.Flush()
    
    # auf beenden des Prozesses warten
    $ps.WaitForExit()
    # ausgaben abholen
    [String]$Err = $ps.StandardError.ReadToEnd()
    [String]$Out = $ps.StandardOutput.ReadToEnd()
    
    # Ausgabe Anzeigen
    $Out
    $Err
    
    # Ausgabe loggen
    $Out | Out-File $LogFilePath -Append
    $Err | Out-File $LogFilePath -Append





    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Freitag, 6. März 2015 07:07

Alle Antworten

  • Hallo Sabine!

    Um PowerShell Externe Programme zu starten, empfehle ich dir die Möglichkeiten zu nutzen die ich in dem folgenden Artikel aufgeführt habe:
    Mehrere Arten mit der PowerShell ein externes Programm zu starten

    http://www.admin-source.de/BlogDeu/791/mehrere-arten-mit-der-powershell-ein-externes-programm-zu-starten

    Für dich müsste die Möglichkeit 5. der & Operator Funktionieren.

    # Schreibwiese mit dem & call Operator
    & 'C:\Program Files (x86)\Informix\bin\ontape.exe' @('-s','-L','0','-t','c:\BTest\DB-Sicherung\b1.txt','<C:\btest\return.txt','-d','>','C:\btest\backup.log','2>&1')

    Du kannst auch in PowerShell die :NET System.Diagnostics.Process Klasse in Verbindung mit der .NET System.Diagnostics.ProcessStartInfo Klasse benutzen.

    Hier hast du die maximale Kontrolle über einen Windows-Prozess.

    # Prozess mit der .NET Klasse System.Diagnostics.Process
    # Ungetestet!
    
    $LogFilePath = 'C:\btest\backup.log'
    
    # Prozess startoptionen festlegen
    $ps = New-Object System.Diagnostics.Process
    $ps.StartInfo.Filename = 'C:\Program Files (x86)\Informix\bin\ontape.exe'
    $ps.StartInfo.Arguments = '-s -L 0 -t "c:\BTest\DB-Sicherung\b1.txt" -d'
    $ps.StartInfo.RedirectStandardOutput = $True
    $ps.StartInfo.RedirectStandardError = $True
    $ps.StartInfo.RedirectStandardInput = $True
    $ps.StartInfo.UseShellExecute = $False
    
    # Prozess starten
    $ps.Start()
    
    # input in den Prozess schreiben
    $ps.StandardInput.Write([Char[]]'C:\btest\return.txt')
    $ps.StandardInput.Flush()
    
    # auf beenden des Prozesses warten
    $ps.WaitForExit()
    # ausgaben abholen
    [String]$Err = $ps.StandardError.ReadToEnd()
    [String]$Out = $ps.StandardOutput.ReadToEnd()
    
    # Ausgabe Anzeigen
    $Out
    $Err
    
    # Ausgabe loggen
    $Out | Out-File $LogFilePath -Append
    $Err | Out-File $LogFilePath -Append





    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Freitag, 6. März 2015 07:07
  • Hallo Peter,

    leider habe ich keine Nachricht bekommen, das hier eine Antwort geschrieben wurden und erst heute Deinen Eintrag gesehen.

    Leider haben Deine Vorschläge nicht funktioniert.

    Mit der 1. Variante bekomme ich folgende Fehlermeldung:

    ontape.exe : invalid argument
    Bei Zeile:1 Zeichen:2
    + & <<<<  'C:\Program Files (x86)\Informix\bin\ontape.exe' @('-s','-L','0','-t','c:\BTest\DB-Sicherung\b1.txt','<C:\btest\return.txt','-d','>','C:\btest\backup.log'
    ,'2>&1')
        + CategoryInfo          : NotSpecified: (invalid argument:String) [], RemoteException
        + FullyQualifiedErrorId : NativeCommandError
     
    ontape
    usage:
    { -a [-d]  | 
      -c  | 
      -l [-C | -X] [-d]  |
      -p [-e] [-rename {-f <filename> |
                   -p <old path> -o <old offset> -n <new path> -o <new offset>...}]
         [-t tape_device_path [-v]] [-d]  |
      -S [-d]  | 
      -r [-rename {-f <filename> |
                   -p <old path> -o <old offset> -n <new path> -o <new offset>...}]
         [-D DBspace_list] [-t tape_device_path [-v]] [-d]  | 
      -s [[-L archive_level][-F]] [-A database_list] [-B database_list]
         [-N database_list] [-U database_list] [-t tape_device_path [-v]] [-d]  }
    
    -a Automatic backup of logical logs
    -c Continuous backup of logical logs
    -d non-interactive mode for back up to or restore from a directory
    -l Logical restore
    -p [-e] Physical restore (-e for external physical restore)
    -r Full restore DBspaces/BLOBspaces as listed
    -s Archive full system
    -A set the following database(s) to ansi logging
    -B set the following database(s) to buffered logging
    -C continuous logical log restore
    -F Backup 
    without updating archive information (useful for HDR, cloning etc.)
    -N set the following database(s) to no logging
    -S Salvage logical logs only
    -U set the following database(s) to unbuffered logging
    -X finish continuous logical log restore and bring server to quiescent mode
    
    -rename rename chunks during cold restore
      with -rename options :
        -f <filename> pathname of file containing list of mapped
                      chunk pathnames and offsets
        -p old pathname of chunk
        -o old offset of chunk
        -n new pathname of chunk
        -o new offset of chunk
    -t Set the tape device path for current backup or restore. Use STDIO for
       backup to standard output or restore from standard input.
    -v Write informational message to standard error during a backup to standard 
       output or restore from standard input

    So ähnlich hatte ich es auch schon versucht und bin eben bis zu dem Punkt gekommen, das die Eingabe-Umlenkung in Powershell nicht vorhanden ist und ontape eben auf eine Eingabe wartet.

    Und mit der 2. Variante bleibt das Skript im Warten-Prozess hängen. Nach einer Stunde habe ich es dann abgebrochen. Eine Hinweis- oder Fehlermeldung habe ich hier nicht bekommen. Ich habe auch noch nie mit dieser Klasse gearbeitet und erst vor Kurzem angefangen mich mit Powershell zu beschäftigen. Da ist noch Vieles Neuland.

    Gibt es vielleicht noch weitere Möglichkeiten?

    Danke und Grüße

    Sabine


    • Bearbeitet kleo-patra Mittwoch, 1. April 2015 09:20
    Mittwoch, 1. April 2015 09:19
  • Die 2. Variante läuft natürlich so lange, wie das Backup dauert!

    Hast du dir angesehen ob Ontape in die 'C:\btest\backup.log' schreibt ? Lösche diese Datei vorher, um zusehen ob ein neues Log angelegt wird!

    Die Ontap.exe ist nun mal ein (besonderer) DOS Befehl.
    Also sollte er wohl auch in der DOS Umgebung laufen!
    Ich glaube hier gilt die Regel: Never change a running Batch ;-)
    Es besteht kein zwingender Grund, bestehende Batches umzustellen.
    Das wäre wohl das einfachste.

    Wenn du das unbedingt innerhalb eines PowerShell Skriptes erledigen möchtest, kannst du auch die CMD oder die Batch von PowerShell aus aufrufen.

    Um PowerShell Externe Programme zu starten, empfehle ich dir die Möglichkeiten zu nutzen die ich in dem folgenden Artikel aufgeführt habe:
    Mehrere Arten mit der PowerShell ein externes Programm zu starten

    http://www.admin-source.de/BlogDeu/791/mehrere-arten-mit-der-powershell-ein-externes-programm-zu-starten

    Für dich müsste die Möglichkeit "6. cmd /c – Die DOS Konsole zum Ausführen benutzen", infrage kommen.

    CMD /C '"C:\Program Files (x86)\Informix\bin\ontape.exe" -s -L 0 -t "C:\BTest\DB-Sicherung\b1.txt" <"C:\btest\return.txt" -d > "C:\btest\backup.log" 2>&1'


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Mittwoch, 1. April 2015 10:36
  • Hallo Peter,

    leider habe ich auch damit kein Erfolg. Ich habe es mal mit verschiedenen Varianten von Anführungszeichen versucht und bekomme verschiedene Fehlermeldungen:

    1. Versuch (wie von Dir vorgeschlagen)

    CMD /C '"C:\Program Files (x86)\Informix\bin\ontape.exe" -s -L 0 -t "C:\BTest\DB-Sicherung\b1.txt" <"C:\btest\return.txt" -d > "C:\btest\backup.log" 2>&1'

    führt zu folgender Fehlermeldung:

    Der Befehl "C:\Program" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

    2 weitere Varianten:

    CMD /C "C:\Program Files (x86)\Informix\bin\ontape.exe"  -s -L 0 -t "C:\BTest\DB-Sicherung\b1.txt" <"C:\btest\return.txt" -d > "C:\btest\backup.log" 2>&1
    CMD /C 'C:\Program Files (x86)\Informix\bin\ontape.exe'  -s -L 0 -t 'C:\BTest\DB-Sicherung\b1.txt' <'C:\btest\return.txt' -d > 'C:\btest\backup.log' 2>&1

    und die folgende Fehlermeldung:

    Der Operator "<" wird noch nicht unterstützt. Bei C:\btest\cmd-test.ps1:3 Zeichen:101 + CMD /C 'C:\Program Files (x86)\Informix\bin\ontape.exe' -s -L 0 -t 'C:\BTest\DB-Sicherung\b1.txt' < <<<< 'C:\btest\return.txt' -d > 'C:\btest\backup.log' 2>&1 + CategoryInfo : ParserError: (<:OperatorToken) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : RedirectionNotSupported

    Und nochmal 2:

    CMD /C "'C:\Program Files (x86)\Informix\bin\ontape.exe'  -s -L 0 -t 'C:\BTest\DB-Sicherung\b1.txt' <'C:\btest\return.txt' -d > 'C:\btest\backup.log' 2>&1"
    CMD /C '`"C:\Program Files (x86)\Informix\bin\ontape.exe`" -s -L 0 -t `"C:\BTest\DB-Sicherung\b1.txt`" <`"C:\btest\return.txt`" -d > `"C:\btest\backup.log`" 2>&1'

    Und die Fehlermeldung:

    cmd.exe : Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch. Bei C:\btest\cmd-test.ps1:5 Zeichen:4 + CMD <<<< /C '`"C:\Program Files (x86)\Informix\bin\ontape.exe`" -s -L 0 -t `"C:\BTest\DB-Sicherung\b1.txt`" <`"C:\btest\return.txt `" -d > `"C:\btest\backup.log`" 2>&1' + CategoryInfo : NotSpecified: (Die Syntax für ...ung ist falsch.:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError

    Es scheint, als gebe es keine Möglichkeit der Anpassung des Skriptes auf Powershell.

    Is' dann halt so. Aber trotzdem vielen Dank für Deine Mühe.

    Liebe Grüße

    Sabine

    Dienstag, 21. April 2015 11:11
  • Nachtrag:

    Nachdem ich mich erstmal mit anderen Dingen beschäftigt habe, habe ich mich gestern mal wieder diesem Thema gewidmet. Irgendwie hat es mich nicht befriedigt, weiterhin mehrere und auch verschiedene Skripte zu verwenden und da bin ich auf die Idee gekommen, das Windows-Skript zur Laufzeit zu erstellen, mit invoke-expression zu starten und anschliessend wieder zu löschen.

    Ist vielleicht nicht die eleganteste Art und Weise einen Workaround zu kreieren, aber auf die Art und Weise habe ich wenigsten nur ein Skript "rumliegen".

    Grüße

    Sabine

    Mittwoch, 12. August 2015 09:18