Seite 1 von 1
Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Mi, 24.02.2010 16:26
von geimist
Hallo,
über Basic möchte ich ein Powershell-Script ausführen und davon einen Rückgabewert weiterverarbeiten können.
Derzeit habe ich 2 Probleme:
1. Das Script funktionstüchtig an die Powershell zu übergeben
2. ich weiß nicht, wie ich eine Rückgabe empfangen kann.
Zum Testen habe ich einmal folgendes Beispiel, dass einfach die Zeile mit den Suchergebnissen von eBay ausliest:
Code: Alles auswählen
$sURL1="http://shop.ebay.de/items/__neu_W0QQLHQ5fAuctionZ1QQ_trksidZp3286Q2ec0Q2em301"
$ie=New-Object -ComObject internetExplorer.application
$ie.Visible=$false
$ie.Navigate($sURL1)
while( $ie.busy){ Start-Sleep 1}
$sHTML1 = $ie.Document.getElementByID("v4-33")
$sHTML1 | findstr "outerText"
$ie.quit()
Das Testscript funktioniert in der Powershell einwandfrei und gibt in etwa folgende Zeile aus:
outerText : 798.256 Ergebnisse gefunden für neu [ Suche speichern ]
Jetzt habe ich versucht, das Ganze nach Basic zu portieren:
Code: Alles auswählen
REM ***** BASIC *****
sub PowerShellTest
sPS = "$sURL1=""http://shop.ebay.de/items/__neu_W0QQLHQ5fAuctionZ1QQ_trksidZp3286Q2ec0Q2em301""" + Chr(13)
sPS = sPS + "$ie.Navigate($sURL1)"+chr(13) 'URL aufrufen
sPS = sPS + "while( $ie.busy){ Start-Sleep 1}"+chr(13) 'warten, bis Browser fertig
sPS = sPS + "$sHTML1 = $ie.Document.getElementByID(""v4-33"")"+chr(13)
sPS = sPS + "$sHTML1 | findstr ""outerText"""+chr(13)
sPS = sPS + "$ie.quit()" + chr(13) 'Browser schließen
sHTML = Shell( "cmd.exe /cStart " & "powershell >" & sPS)
msgbox sHTML
End Sub
Aber wie gesagt, ich bekomme noch nicht einmal das Script über Basic zum laufen.
Habt ihr eine Idee?
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Mi, 24.02.2010 19:39
von Karolus
Hallo
1. Evtl. via UNO ...systemshellexecute() ?
Code: Alles auswählen
sPS = "http://shop.ebay.de/items/__neu_W0QQLHQ5fAuctionZ1QQ_trksidZp3286Q2ec0Q2em301"
spfad = converttourl ( "c:pfad\zu\powershell" )
oService = createUnoService("com.sun.star.system.SystemShellExecute")
oService.execute( spfad , sPS , 0 )
oder
'spfad = converttourl ( "c:pfad\zum\powershellscript" )
'oService.execute( spfad , , 0 )
2. Bring dem Script bei in eine .txt Datei zu Schreiben und lies diese mit Basic aus.
http://www.dannenhoefer.de/faqstarbasic ... ml#readini
Gruß Karo
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Do, 25.02.2010 10:27
von geimist
Hallo Karo,
vielen Dank schon einmal. Anscheinend kann ich zumindest schon mal den Befehl an die PowerShell übergeben
Aber da kommt auch schon wieder das nächste: Wahrscheinlich muss ich die Zeichen noch anders Maskieren, um die Zeichenkette mit den Anführungszeichen korrekt übergeben zu können.
Es erscheint folgende Meldung:
Ich frage mich, woher die unregelmäßige Anzahl an '<' und '>' herkommen (oder sind das Klammern?)

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Do, 25.02.2010 10:39
von Karolus
Hallo
Ich frage mich, woher die unregelmäßige Anzahl an '<' und '>' herkommen (oder sind das Klammern?)
Nein, die 'zeigen' wohl auf die Fehlerstelle, und nach der Fehlermeldung unten 'fehlt eine schliessende Klammer ' in dem Fall eigentlich ein '> zeichen' .
Übrigens, kannst du solche Fehlermeldungen auch per copy and paste hier posten, da brauchts wirklich keinen Screenshot!
Gruß Karo
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Do, 25.02.2010 11:46
von geimist
Das die Schreibweise im Shellfenster nicht korrekt ist, habe ich auch bemerkt. Wie schon in der einleitenden Frage beschrieben, funktioniert das Script direkt in der Shell ausgeführt einwandfrei. Mir ist nur aufgefallen, dass in dem Shellfenster keinerlei Anführungszeichen vorhanden sind, obwohl ich diese für die Strings mit übergeben muss, daher meine Vermutung, dass ich die Anführungszeichen noch irgendwie maskieren muss. Und natürlich frage ich mich, wie die wirren '<<<' zustande kommen.
(Ich hätte die Fehlermeldung in der Shell nicht lesen können, wenn ich sie nicht mit einem Screenrecorder aufgenommen hätte. Natürlich hätte ich den Inhalt dann auch abschreiben können, aber so war es doch das einfachste...

)
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Fr, 26.02.2010 13:49
von geimist
Also - jetzt bin ich einen Schritt weiter.
Was die Befehlsübergabe an die Powershell betrifft, so war mein Fehler, dass ich die doppelten Hochkommas mit selbigen maskiert habe. Um einen String an die PS korrekt als solchen zu übergeben, musste ich einfache Hochkammas verwenden. Nun kann ich beliebige Befehle von Basic aus an die PS übergeben und ausführen lassen.
Jetzt habe ich immer noch das 2. Problem, nämlich einen Rückgabewert in Basic von der PS empfangen zu können. Natürlich könnte ich z.B. eine .ini-Datei von der PS schreiben lassen, aber da habe ich wieder das Problem, dass Basic nicht darüber informiert wird, wann das PS-Script abgearbeitet ist
Wenn also jemand noch eine Idee hat, bin ich sehr dankbar.
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Fr, 26.02.2010 16:19
von eBayer
Hallo Stephan,
lasse doch einfach von PS als letzte Aktivität eine Flag-Datei schreiben..... "Ende.TXT" oder so.
Dann kannst Du davon ausgehen daß der Job beendet ist, wenn die "Ende.txt" da ist.
Gruß eBayer
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Fr, 26.02.2010 16:48
von geimist
Gute Idee. Also würde ich über eine Schleife so lange nach der Flag-Datei suchen, bis diese vorhanden ist.
Interessant finde ich auch, was Stephan
hier geschrieben hat. Die Anwendung, zu welcher er verlinkt hat, stellt eine passende Methode zur Verfügung. Aus der Beschreibung: "
... Unter Basic kann man ReadExecResult() wie den Befehl Shell() verwenden, mit dem Unterschied, dass auf das Ergebnis des Aufrufs gewartet wird (synchrone Ausführung). ..."
Leider ist das Ganze für OOo 1.x.x geschrieben, und ich habe es noch nicht wirklich für mich umsetzen können (habe den ganzen Nachmittag schon probiert ...)
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Di, 02.03.2010 11:45
von geimist
Dank eurer Hilfe funktioniert der Ablauf schon einmal.
Allerding stehe ich noch vor einem kosmetischen Problem:
Ich möchte das Ganze ja automatisiert ablaufen lassen (Datei öffnen / Script ausführen / Datei speichern und schließen).
An folgender Stelle scheint das Makro aber immer so lange zu hängen, bis ich das Dokument (Calc-Tabelle in der das Makro läuft) anklicke, bzw. darin eine Aktion durchführe (z.B. ein Menü öffnen oder ein anderes Tabellenblatt wählen).
Ich habe den Hänger auch schon etwas lokalisieren können, und zwar in der Schleife, die solange sucht, bis die temporär erzeugte Datei des Powershell-scripts vorhanden ist.
Code: Alles auswählen
Lz1 = timer()
'-------------
i = 0
Do until FileExists( sZiel )
wait 1000
i = i+1
If i > 60 then Exit Do
loop
Lz2 = timer()
tDauer = Lz2 - Lz1
'=========
sLOG= sLOG & tDauer & " Sek. gewartet / " & i & " Schleifendurchläufe - " & sTimeOnly(now) & chr(13)
'===
Der LOG sieht dann so aus:
Beginn: 11:25:16
minimiert: 11:25:16
Datei gelöscht: 11:25:16
Script ausgeführt: 11:25:16
216 Sek. gewartet / 1 Schleifendurchläufe - 11:28:52
Datei ausgelesen: 11:28:52
nächste leere Zelle gesucht: 11:28:52
Daten geschrieben: 11:28:52
Datei gelöscht: 11:28:52
Die 216 Sekunden sind die Zeit, welche ich gewartet habe um etwas zu unternehmen. Vom Aufbau der Schleife, dürfte diese ja eigentlich nur 60 Sekunden laufen und anschließend abbrechen. Aus irgend einem Grund läuft die Schleife nicht richtig, oder?
Habt ihr einen Tipp für mich?
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Mi, 03.03.2010 17:48
von hawe
Da würd ich doch Nägel mit Köpfen machen und den OLE-Server vom IE direkt bedienen
oder versteh ich das Anliegen flasch?
Code: Alles auswählen
Sub using_IE( )
Dim oleService
Dim IE
oleService = createUnoService("com.sun.star.bridge.OleObjectFactory")
IE = oleService.createInstance("InternetExplorer.Application.1")
IE.Visible = 1
IE.Navigate("http://www.openoffice.org")
End Sub
siehe
http://www.oooforum.org/forum/viewtopic.phtml?t=9815
Re: Wie Powershell-Script ausführen und Wert zurückerhalten?
Verfasst: Do, 04.03.2010 15:57
von geimist
Hallo hawe,
vielen Dank für deinen Tipp.
Wenn man manchmal wüsste, was so alles möglich ist ...
___________
Übrigens: Der Hänger liegt nicht an der Schleife. Alternativ habe ich einmal eine lange Pause eingebaut und auch da hängt dann an dieser Stelle die Makroausführung. Wenn ich allerdings nach dem Aufruf der PowerShell den Focus wieder auf OOo legen, wird die Makroausführung nicht unterbrochen - da muss wohl der Fehler liegen.