Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Débutant Power-Shell

25 réponses
Avatar
Michel Claveau
Bonsoir !

Avec PowerShell, si on veut utiliser Internet-Explorer par COM, on peut
utiliser :
$ie=(New-Object -com 'InternetExplorer.Application')

Ce que je voudrais, c'est connecter à une instance Internet-Explorer
déjà ouverte.

Avec Python, il suffit de faire
win32com.client.Dispatch('{9BA05972-F6A8-11CF-A442-00A0C90A8F39}')
pour récupérer une liste des handles COM des instances ouvertes.

Comment faire la même chose en PowerShell ?

Merci d'avance.







--
@-salutations

Michel Claveau

10 réponses

1 2 3
Avatar
Méta-MCI
Re !

Même Document.Write refuse de fonctionner...

Document.Body.innerHTML = "XXXX" marche ; mais c'est insuffisant.













@+

MCI
Avatar
Méta-MCI
Re !

J'ai essayé un autre truc, qui n'a pas marché non plus :

- création d'un <div id="TTT"> (dans la page HTML)

- connexion : var o=document.getElementById('TTT'); (en jscript, au
chargement de la page)

- affectation de l'objet Window comme propriété de l'objet o : o.WIN=self;
(jscript)

- sous PowerShell, connection à l'objet : $t =
$ie.Document.getElementById("TTT") (après avoir ouvert IE, dans $ie)

- vérification : echo $t.outerHTML ; jusque là, c'est bon, on voit
bien le HTML

- connection à la propriété : $w = $t.WIN Mais, là, ça ne marche plus
! l'objet $w reste désespérement vide.



J'ai une autre idée, mais j'ai peur que cela ne marche pas...
Avatar
Méta-MCI
Re !

Dernier essai : encore un échec.

J'ai créé une propriété à un objet DIV ; à cette propriété, j'ai affecté
l'objet window.
J'ai aussi créé une fonction de contrôle (en javascript), pour lancer une
fonction d'affichage de cette propriété (de window, donc).

Ensuite, côté power-shell, si j'appelle la fonction de contrôle directement
: $ie.Navigate(" javascript: ctrl();") ça fonctionne (donc tout est en
place)
Mais, si on peut bien se connecter à l'objet DIV, impossible d'adresser la
propriété... J'ai l'impression que PS bloque toute connexion, via IE
(seulement), à un objet de type COM, inclus dans un autre objet.


Dur ! Dur !
Avatar
Jacques Barathon [MS]
"Méta-MCI" wrote in message
news:eBSlK$
Re !

Dernier essai : encore un échec.

J'ai créé une propriété à un objet DIV ; à cette propriété, j'ai affecté
l'objet window.
J'ai aussi créé une fonction de contrôle (en javascript), pour lancer une
fonction d'affichage de cette propriété (de window, donc).

Ensuite, côté power-shell, si j'appelle la fonction de contrôle
directement : $ie.Navigate(" javascript: ctrl();") ça fonctionne (donc
tout est en place)
Mais, si on peut bien se connecter à l'objet DIV, impossible d'adresser la
propriété... J'ai l'impression que PS bloque toute connexion, via IE
(seulement), à un objet de type COM, inclus dans un autre objet.


Je n'ai jamais pratiqué le pilotage d'IE par script, je ne peux donc pas
t'aider, mais ton retour d'expérience est intéressant. Il faudrait voir avec
l'équipe PowerShell s'il s'agit d'un bug (ça en a l'air mais encore faut-il
pouvoir le qualifier correctement). Peux-tu soumettre ton problème sur le
forum US? Dis-moi si tu as besoin d'aide sur une mise en forme en anglais.

Jacques

Avatar
Jean
Même Document.Write refuse de fonctionner...


$IE.Document|gm

#---8<---
$IE=new-object -com "InternetExplorer.Application"
$IE.Navigate("about:blank")
$IE.visible=$true
$IE.document.IHTMLDocument2_write("OK")
#---8<---

Par contre pour prendre la fenêtre avec:

$IE.document.IHTMLDocument2_get_parentWindow()
ou
$IE.document.get_parentWindow()

----------> « Le cast spécifié n'est pas valide. »

J'ai déjà essayé différentes choses sans succès (jusqu'à présent :-) ?)
.


Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
document.parentWindow n'est pas récupéré.


Une *demi-solution* (je l'aurais bien mis en majuscules).

En utilisant l'objet ScriptControl qui, sauf erreur de ma part est
installé par défaut sous tout les OS capables de faire tourner
PowerShell.

J'ai choisi JScript comme language parcequ'il est plus agréable pour
manipuler le DOM et que j'ai besoin par la suite d'un eval (en VBScript
il faudrait faire des distinctions d'utilisation d'Eval et
d'Execute(Global)).
Pour Michel : Python ne serait pas exclu :-)

Dans les 2 exemples qui suivent on suppose qu'une fenêtre IE nommée
"BOND" a été ouverte.

Un premier exemple qui récupère directement le document d'une fenêtre
IE nommée dans PowerShell :

#---8<---.PS1---Jean-JMST-Belgium---
# On suppose qu'une fenêtre IE
# nommée BOND est ouverte

$nom_fenetre="BOND"

# Création et définition du ScriptControl
$SC=New-Object -com ScriptControl
$SC.Language='JScript'
$code 'function IE_Document(nom){'+
' with(new ActiveXObject("InternetExplorer.Application")){'+
' navigate("about:blank");'+
' while(busy){void true};'+
' return document.parentWindow.open("",nom).document'+
' }'+
'}'
$SC.AddCode($code)
$script=$SC.CodeObject
# récupère le document de la fenêtre dans $iedoc
$iedoc=$script.IE_Document($nom_fenetre)
# Crée une balise <b>
$btag=$iedoc.body.appendChild($iedoc.createElement('b'))
# modifie le contenu de la balise
$btag.innerText='My name is Bond, James Bond'
$iedoc.body.innerHTML+='<br />'
# Crée une balise <i>
$itag=$iedoc.body.appendChild($iedoc.createElement('i'))
# Affiche une horloge pendant 1 minute dans la balise
# ... c'est James Bond quand même ...
0..59|%{
if($_%2 -eq 0)
{$itag.style.backgroundColor='yellow'}
else
{$itag.style.backgroundColor='lemonchiffon'}
$itag.innerText=Get-Date
Start-Sleep 1
}
# Affiche le contenu texte de la balise <body>
$iedoc.body.innerText
#---8<---.PS1---Jean-JMST-Belgium---

Second exemple qui permet par exemple d'accéder à l'objet window de la
fenêtre IE nommée :

#---8<---.PS1---Jean-JMST-Belgium---
# On suppose qu'une fenêtre IE
# nommée $nom_fenetre est ouverte

$nom_fenetre="BOND"

$SC=New-Object -com ScriptControl
$SC.Language='JScript'
$code 'function Acceder_IE(nom,quoi){'+
' with(new ActiveXObject("InternetExplorer.Application")){'+
' navigate("about:blank");'+
' while(busy){void true};'+
' with(document.parentWindow.open("",nom)){'+
' var r=eval(quoi)'+
' };'+
' quit()'+
' };'+
' return r'+
'}'
$SC.AddCode($code)
$script=$SC.CodeObject
$iedoc=$script.Acceder_IE(
$nom_fenetre,
'document'
)
$btag=$iedoc.body.appendChild($iedoc.createElement('b'))
$btag.innerText="Bond dit : CLIQUEZ !"
#ajoute un événement onclick sur <body>
$script.Acceder_IE(
$nom_fenetre,
'document.body.onclick=function(){this.style.backgroundColor="red"}'
)
# Affiche la propriété screenLeft de
# l'objet window dans PowerShell
$script.Acceder_IE(
$nom_fenetre,
'screenLeft'
)
#Affiche un message dans la fenêtre
$script.Acceder_IE(
$nom_fenetre,
'alert("Bien le bonjour de PowerShell")'
)

#---8<---.PS1---Jean-JMST-Belgium---

... il n'empêche, les recherches continuent ... une fois ... :-)

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
A passage, merci pour le résumé :-)

Amicalement,

--
Jean - JMST
Belgium
Avatar
Jean
Dans les 2 exemples qui suivent on suppose qu'une fenêtre IE nommée "BOND"


Pour compléter, un script qui illustre la création d'une fenêtre ie
nommée avec le même principe :

#---8<---.PS1---Jean-JMST-Belgium---
# Crée une fenêtre IE nommée $nom_fenetre
$nom_fenetre="BOND"

# Création et définition du ScriptControl
$SC=New-Object -com ScriptControl
$SC.Language='JScript'
$code 'function Creer_Fenetre_Nommee(nom){'+
' with(ie=new ActiveXObject("InternetExplorer.Application")){'+
' navigate("about:blank");'+
' while(busy){void true};'+
' document.parentWindow.name=nom;'+
' return ie'+
' }'+
'}'
$SC.AddCode($code)
$script=$SC.CodeObject

$IE=$script.Creer_Fenetre_Nommee($nom_fenetre)
$IE.visible=$true
$IE.document.body.innerText='James'

# Ferme la fenêtre après 5 secondes
#Start-Sleep 5
#$IE.Quit()
#---8<---.PS1---Jean-JMST-Belgium---

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
Une *demi-solution*


Pour finir avec cette voie, en prenant un shaker, un peu de sulfite et
en secouant bien, un script PS :

#---8<---New-IENamed.ps1---Jean-JMST-Belgium---
#=4/2007==================================Version 0=====#
#== Creates or gets an Internet Explorer named window ==#
#
# PARMETERS
# $name : name of the window to create or to get
# $code (string containing JScript code):
# If not present a new window named $name is created.
# An InternetExplorer.Application object is returned.
# If present get the IE window named $name and executes
# JScript code.
# Result of JScript code is returned.
#
# EXAMPLES
#
# Create an new IE window named CHARLIE, write CHAPLIN
# in it's document and close after 15 seconds:
# $ie=.New-IENamed 'CHARLIE'
# $ie.visible=$true
# $ie.document.body.innerText='CHAPLIN'
# Start-Sleep 15
# $ie.Quit()
#
# Get an IE window named CHARLIE and :
# -output the screenLeft property
# .New-IENamed 'CHARLIE' 'screenLeft'
#
# -retrieve the document object, write CHAPLIN
# ,change body background color and set an
# onclick event on the body
# $iedoc=.New-IENamed 'CHARLIE' 'document'
# $iedoc.IHTMLDocument2_write('CHAPLIN')
# $iedoc.body.style.backgroundColor='tomato'
# .New-IENamed 'CHARLIE' 'document.body.onclick # function(){alert("CHAPLIN")}'
#
# -show a dialog box saying CHAPLIN
# .New-IENamed 'CHARLIE' 'alert("CHAPLIN")'
#
#=========Tested on PowerShell 1========================#

param([string]$name,[string]$code)

if(!$name){return $false}

$SC=New-Object -com ScriptControl
$SC.Language='JScript'
$JScode 'function IE_Named(iename,code){'+
' with(ie=new ActiveXObject("InternetExplorer.Application")){'+
' navigate("about:blank");'+
' while(busy){void true};'+
' if(code){'+
' with(document.parentWindow.open("",iename)){'+
' var r=eval(code);'+
' };'+
' quit();'+
' return r'+
' }'+
' else{'+
' document.parentWindow.name=iename;'+
' return ie'+
' }'+
' }'+
'}'

$SC.AddCode($JScode)
$script=$SC.CodeObject

if($code){
return $script.IE_Named($name,$code)
}
else{
return $script.IE_Named($name,$false)
}
#---8<---New-IENamed.ps1---Jean-JMST-Belgium---

Amicalement,

--
Jean - JMST
Belgium

Avatar
Michel Claveau
Bonsoir !

Je n'ai pas testé les deux derniers scripts.
Mais j'ai mis en évidence un truc intéressant.

A partir d'une fichier .HTML, contenant un peu de JScript, qui ouvre un
ActiveX (dans la variable oax), et la fonction suivante :
function tst(){
alert(window.name); //ligne_0
//alert(oax.test()); //ligne_A
}

D'une manière très similaire à vous, je crée une fonction "foo" en
JScript, qui ouvre IE, navigue sur le fichier .HTML, et lance tst().

Et ça fonctionne.

Normal(ement).


MAIS, si, dans le fichier .HTML, on enlève le commentaire de ligne_A,
ça ne marche plus.

On obtient ça :

Exception lors de l'appel de « Eval » avec « 1 » argument(s) :
« Exception de HRESULT : 0x80020101 »
Au niveau de ligne : 1 Caractère : 9
+ $SC.eval( <<<< "foo('AZER')")

De plus, ce message d'erreur apparaît APRES l'affichage de la ligne_0
Si l'on attend 10 minutes avant de cliquer sur le [OK] de la boîte de
dialogue, le message d'erreur attendra.


Si on remet le commentaire, ça remarche !!!!!!!!!!!!

Le même fichier HTML + tst() fonctionne parfaitement, avec le même code
ScriptControl.JScript, s'il est appelé via un script Python.


Conclusion : Power-Shell bloque toute utilisation de fonctions
COM/ActiveX.
AMHA, la paranoïa sécuritaire est devenue pandémique ;o)))


Pour m'amuser, je vais essayé avec un setTimeout, qui appelerait la
même fonction COM, une fois la main rendue à PowerShell...









--
@-salutations

Michel Claveau
1 2 3