Question
Probleme avec Invoke-Command et manip doc Word
- IDFNaute
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 11
- Remerciements reçus 0
Je viens soumettre mon problème aux experts du forum. J'ai effectué une recherche sur le forum et Google sans vraiment trouver de résultat.
Voici le context :
Lors d'un déploiement par MDT je souhaiterait imprimé un document Word personnalisé pour l'utilisateur. Lors de la séquence de tache MDT, le compte utilisé est l'administrateur local de la machine.
J'utilise donc un Invoke-Command, pour exécuter le script sur un serveur possédant la bonne imprimante ainsi que Word.
Lorsque j'exécute le script sans passer par le Invoke-Command sur le serveur directement, tout se passe sans problème. J'en conclue que le problème provient du passage en Invoke-Command.
Je vous ai fourni le code (les premières variables sont en dur pour les tests mais en production elles seront dynamiques).
[code:1]
### Variables ###
$NomComplet = \"Albert DUPOND\"
$Login = \"adupond\"
$userpower = \"Domaine\utilisateur\"
$passwordpower = ConvertTo-SecureString \"MDP\" -AsPlainText -Force
$credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($userpower,$passwordpower)
### Script ###
Invoke-command -computername serveur.domaine. -credential $credentials -ArgumentList ($NomComplet,$Login) -scriptblock{
param($NomComplet,$Login)
$EmplacementTemplate = \"\\Emplacement-Réseau\Template-AMI_X.docx\"
$societe = \"Societe A\"
$date = get-date -uformat \"%Y%m%d\"
$NomAMI = \"$date-$Nomcomplet\" + \".docx\"
$FicheAMI = \"\\Emplacement-Réseau\AideMemoireInformatique\$NomAMI\"
###Fonction####
function GenerationFiche ($NomComplet,$Login,$EmplacementTemplate,$FicheAMI){
$ARemplacer1 = \"Prénom NOM\"
$Remplacant1 = \"$NomComplet\"
$ARemplacer2 = \"login\"
$Remplacant2 = \"$Login\"
$ARemplacer3 = \"Mdp2014\"
$annee = get-date -uformat %Y
$Remplacant3 = 'Societe' + $Remplacant2.Substring(0,2) + $annee
$Word = new-object -com word.application
$Word.visible = $true#$False
$OpenDoc = $Word.documents.Open($EmplacementTemplate)
$Selection = $Word.selection
Write-Host \"**Premier remplacement**\"
Write-Host \"Le remplacé est $ARemplacer1\"
Write-Host \"Le remplacant est $Remplacant1\"
$Selection.Find.Execute(\"$ARemplacer1\",$False,$True,$False,$False,$False,$True,1,$False,\"$Remplacant1\",2)
Write-Host \"Remplacement du login\"
$Selection.Find.Execute(\"$ARemplacer2\",$False,$True,$False,$False,$False,$True,1,$False,\"$Remplacant2\",2)
Write-Host \"Remplacement du mot de passe\"
$Selection.Find.Execute(\"$ARemplacer3\",$False,$True,$False,$False,$False,$True,1,$False,\"$Remplacant3\",2)
Write-Host \"Sauvegarde de la fiche\"
$OpenDoc.SaveAs([ref]\"$FicheAMI\"«»)
Write-Host \"Impression de la fiche\"
$Word.printout()
Write-Host \"Fermeture de l'application\"
$OpenDoc.close();
}
if ($societe -eq \"Societe B\"«»){
Write-Host \"La société est $societe,l'aide mémoire n'est pas imprimé.\"
}
elseif ($societe -ne \"Societe B\"«»){
Write-Host \"La société est $societe,l'aide mémoire est imprimé.\"
GenerationFiche $NomComplet $Login $EmplacementTemplate $FicheAMI
}
}
[/code:1]
Et voici le résultat qui en découle dans le console.
**Premier remplacement**
Le remplacé est Prénom NOM
Le remplacant est Albert DUPOND
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine
Remplacement du login
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine
Remplacement du mot de passe
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine
Sauvegarde de la fiche
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine
Impression de la fiche
Exception lors de l'appel de « PrintOut » avec « 0 » argument(s) : « Cette méthode ou propriété n'est pas disponible car une fenêtre de document n'est pas active. »
+ CategoryInfo : NotSpecified: (: ) [], MethodInvocationException
+ FullyQualifiedErrorId : COMException
+ PSComputerName : serveur.domaine
Fermeture de l'application
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine
J'ai essayé sans passer par ISE pour vérifier que le problème ne venait pas de là, cela n'a rien changé.
Pour info, je me suis inspiré de ce script pour la manipulation du doc Word : www.loone.net/?p=120
Bonne journée à vous
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
La session distante ne peut adresser le moniteur, l'instruction .visible=$true est fausse ou en tout cas inopérante.
Il n'y a pas de sélection de texte, ta sélection est peut vide/$null.
J'ai un doute pour l'accès à l'objet COM, des logs sur les étapes de construction du doc seront utiles.
Les versions de PS sont-elle identique de chaque côté ?
Pour test test tu utilises la même version d'Office ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- IDFNaute
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 11
- Remerciements reçus 0
Pour l'instruction $Word.visible = $true#$False je l'ai mise en True pour voir les modifications, et effectivement on voit bien les remplacements de chaine de caractère (à terme, elle devra être en $False).
Je ne comprends pas bien ce que tu veux dire par \"Il n'y a pas de sélection de texte, ta sélection est peut vide/$null.\"
Normalement il fait la sélection de texte à ce moment là, si je ne me trompe pas :
[code:1]$Selection.Find.Execute(\"$ARemplacer1\"...[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
'peut être vide ou $null'.Je ne comprends pas bien ce que tu veux dire par \"Il n'y a pas de sélection de texte, ta sélection est peut vide/$null.\"
Ceci semble affecter $null à la variable $Selection
[code:1]$Selection = $Word.selection[/code:1]
IDFNAUTE écrit:
Il y a qq temps que je n'ai pas codé d'automatisme avec Word, mais là tu fais un cherche/remplace sur une étendue (range) existante, cela ne sélectionne pas l'étendue .Normalement il fait la sélection de texte à ce moment là, si je ne me trompe pas :
Contrôle la propriété InvocationInfo des messages d'erreur 'Impossible d’appeler une méthode dans une expression Null.'<br><br>Message édité par: Laurent Dardenne, à: 19/08/14 16:20
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- IDFNaute
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 11
- Remerciements reçus 0
Le premier est de désactiver l'Invoke-Command pour que le script s'execute en local sur ma machine voila ce que ça donne lorsque je vérifie mes variables :
[code:1]
Write-Host \"Word est : $Word\"
Write-Host \"OpenDoc est : $OpenDoc\"
Write-Host \"La sélection est : $Selection\"
[/code:1]
Le résultat :
[code:1]
Word est : Microsoft.Office.Interop.Word.ApplicationClass
OpenDoc est : Microsoft.Office.Interop.Word.DocumentClass
La sélection est : System.__ComObject
[/code:1]
Maintenant quand je réactive Invoke-Command (en enlevant les commentaires) voici ce qui se passe :
[code:1]
Write-Host \"Word est : $Word\"
Write-Host \"OpenDoc est : $OpenDoc\"
Write-Host \"La sélection est : $Selection\"
[/code:1]
Le résultat :
[code:1]
Word est : Microsoft.Office.Interop.Word.ApplicationClass
OpenDoc est :
La sélection est :
[/code:1]
Avec Invoke-Command, les deux variables $OpenDoc et $Selection ne sont pas attribué d'où les erreurs \"Impossible d’appeler une méthode dans une expression Null.\"
Le souci est que maintenant je ne comprends pas pourquoi elles restent vides.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Je te propose de Logguer le résultat d'un appel à Test-Path sur le chemin du document, vérifier les droits, et sinon d'essayer avec un lecteur mappé (pas un psdrive).Le souci est que maintenant je ne comprends pas pourquoi elles restent vides.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Probleme avec Invoke-Command et manip doc Word