Wie Powershell-Script ausführen und Wert zurückerhalten?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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?
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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:
Bild

Ich frage mich, woher die unregelmäßige Anzahl an '<' und '>' herkommen (oder sind das Klammern?) :shock:
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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... :) )
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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 ...)
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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?
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
hawe
****
Beiträge: 151
Registriert: Di, 05.08.2008 19:47

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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
Gruss HW
Win7/SuSe 11.2 - LO 3.3
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Wie Powershell-Script ausführen und Wert zurückerhalten?

Beitrag 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.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
Antworten