Page 1 sur 1

[R] Changer texte dans un fichier xcu

Posté : jeu. 27 janv. 2011 22:35
par PetitBean
Bonsoir à tous,

Voilà le petit programme que j'aimerai. Je m'explique.
J'utilise la Liberkey et surtout Open Office en version portable.
Hors quand on paramètre son OOo pour que le chemin des "Mes Documents" se trouve sur la clé USB, le souci c'est que la lettre change en permanence d'un ordi à l'autre.
Le paramétrage de se chemin se trouve dans un fichier Paths.xcu dans :
F:\LiberKey\Apps\OpenOffice\Data\settings\user\registry\data\org\openoffice\Office

Le contenu du fichier Paths.xcu :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Paths" oor:package="org.openoffice.Office">
 <node oor:name="Paths">
  <node oor:name="Work">
   <prop oor:name="WritePath" oor:type="xs:string">
    <value>file:///[color=#BF00FF]F:[/color]/LiberKey/MyDocuments</value>
   </prop>
  </node>
 </node>
</oor:component-data>
Ici ma clé c'est F:
Comment détecter la lettre de ma clé et la changer dans le fichier ?

Je vous remercie par avance pour votre aide.

Petit Bean

Re: [..] Changer texte dans un fichier xcu

Posté : jeu. 27 janv. 2011 22:46
par jchd
DriveGetDrive("REMOVABLE") suivi de DriveGetSerial($path) vont _beaucoup_ t'aider à retrouver ta clé parmi l'ensemble des volumes amovibles montés. Cela implique de s'enquérir du "serial_number" de ta clé, mais l'info est fixe (sauf reformatage). Si reformatage aléatoire ou fréquent [pourquoi donc ?] rabats-toi sur DriveGetLabel en prenant soin de nommer a clé d'une façon peu commune (et en priant fort !).

Ensuite adapter le ficher est le boulot d'une REGEXP bien sentie.

Re: [..] Changer texte dans un fichier xcu

Posté : jeu. 27 janv. 2011 22:49
par FernandG
Autre méthode ... :wink:

Créer une sorte de "launcher" à base de :

Code : Tout sélectionner

MsgBox(64, "Lecteur", [b][color=#0000FF]StringLeft(@ScriptDir, 2)[/color][/b])
Remplacer la valeur avec un StringRegExpReplace dans le fichier "Paths.xcu"
Et terminer par un Run de OpenOfficeLKL.exe

Bonne soirée.

Re: [..] Changer texte dans un fichier xcu

Posté : ven. 28 janv. 2011 21:37
par PetitBean
Bonsoir,

Merci pour vos réponses super rapide.

Bon voici le petit script que j'ai fait. Je précise, je débute !!

Code : Tout sélectionner

#Include <Constants.au3>
#include <file.au3>

$lecteur = StringLeft(@ScriptDir, 2)

$sTxt = "<?xml version=""1.0"" encoding=""UTF-8""?>" & @CRLF
$sTxt &= "<oor:component-data xmlns:oor=""http://openoffice.org/2001/registry"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" oor:name=""Paths"" oor:package=""org.openoffice.Office"">" & @CRLF
$sTxt &= " <node oor:name=""Paths"">" & @CRLF
$sTxt &= "  <node oor:name=""Work"">" & @CRLF
$sTxt &= "   <prop oor:name=""WritePath"" oor:type=""xs:string"">" & @CRLF
$sTxt &= "    <value>file:///" & $lecteur & "/LiberKey/MyDocuments</value>" & @CRLF
$sTxt &= "   </prop>" & @CRLF
$sTxt &= "  </node>" & @CRLF
$sTxt &= " </node>" & @CRLF
$sTxt &= "</oor:component-data>"

; Pour écrire dans le fichier Paths.xcu, toute les données et la bonne lettre du lecteur
$hFile = FileOpen($lecteur & "\LiberKey\Apps\OpenOffice\Data\settings\user\registry\data\org\openoffice\Office" & "\Paths.xcu", 2)
FileWrite($lecteur & "\LiberKey\Apps\OpenOffice\Data\settings\user\registry\data\org\openoffice\Office" & "\Paths.xcu", $sTxt )
FileClose($hFile)
En fait je suis parti sur la solution de réécrire le fichier, car je ne connais pas la dernière lettre utilisée auparavant. Là c'était F mais ça aurait pu être E ou une autre.
Je trouve plus simple de faire comme ça, mais je débute !!

Ensuite je mets le fichier exe en lancement auto au démarrage de la LIBERKEY et comme ça mon fichier Paths.xcu sera à jour de la lettre du support USB !!

Si vous avez mieux je prends, et si vous une autre méthode, je prends aussi car je veux apprendre AUTOIT !!!

Merci pour vos prochaines réponses.

Re: [..] Changer texte dans un fichier xcu

Posté : dim. 30 janv. 2011 12:59
par FernandG
PetitBean a écrit :je débute !!
x2
PetitBean a écrit :

Code : Tout sélectionner

$sTxt [b]&=[/b]
Mouais ... :wink:

Sinon, votre approche est correcte et précise.

Remarques :
- Vos #include ne sont pas nécessaire.
- Ajouter un contrôle d'erreur après le FileOpen (et/ou un FileExists):

Code : Tout sélectionner

$hFile = FileOpen($lecteur & "\LiberKey\Apps\OpenOffice\Data\settings\user\registry\data\org\openoffice\Office" & "\Paths.xcu", 2)
If $hFile <> -1 Then
    FileWrite($lecteur & "\LiberKey\Apps\OpenOffice\Data\settings\user\registry\data\org\openoffice\Office" & "\Paths.xcu", $sTxt )
    FileClose($hFile)
Else
    MsgBox(16, "Erreur", "Impossible d'ouvrir le fichier ""Paths.xcu"".")
EndIf
Exit
- Lors de la première lecture, il manquait le FileClose, donc plus besoin d'en parler.

Bonne journée.

Re: [..] Changer texte dans un fichier xcu

Posté : mar. 01 févr. 2011 21:40
par PetitBean
Bonsoir FernandG,

Merci pour la réponse, mais j'ai une question à poser.
Pour quoi le
Mouais ... :wink:
pour $sTxt &=. Y a t il mieux pour écrire le code ?

Vous m'indiquez aussi que les #include ne sont pas nécessaire, mais pour qu'elles raisons ?

Code : Tout sélectionner

$hFile = FileOpen($lecteur & "\LiberKey\Apps\LibreOffice\Data\settings\user" & "\registrymodifications.xcu", 2)
Si je met 10 à la place de 2, est-ce que ça aura le même effet que votre script de vérif ? Là je supprime le fichier pour le recréer ? C'est ça ?

J'ai très envie d'apprendre à programmer avec AutoIt.

Et merci pour le contrôle, j'y avais pas pensé !!

Merci beaucoup !!

Re: [..] Changer texte dans un fichier xcu

Posté : mar. 01 févr. 2011 22:55
par FernandG
PetitBean a écrit :Pourquoi le Mouais ... pour $sTxt &=. Y a t il mieux pour écrire le code ?
Non, justement, ce n'est pas courant de voir un "débutant" écrire un &= sans vouloir généraliser et j'ai cru reconnaître un certain style :wink:
PetitBean a écrit :Si je met 10 à la place de 2, est-ce que ça aura le même effet que votre script de vérif
En mettant le mode à 10 dans FileOpen le contrôle est implicite, comme l'explique le flag 8.
PetitBean a écrit :Vous m'indiquez aussi que les #include ne sont pas nécessaire, mais pour qu'elles raisons ?
Exemple, ouvrez le fichier "File.au3" dans le dossier include d'AutoIt3, vous verez que votre code ne fait référence à aucune fonction présente ...
► Afficher le texte
Bonne soirée.

Re: [..] Changer texte dans un fichier xcu

Posté : mer. 02 févr. 2011 17:01
par GaRydelaMer
Bonjour

comme j'ai vu que tu voulais apprendre à programmer avec AutoIt:
Je te propose de faire ca avec les composants COM de windows, sachant que bien sur AutoIt sait les utiliser.
Ton fichier est un fichier XML, microsoft a créer un composant installé sur tous les windows qui permet la manipulation des fichiers XML, création, lecture modification.

Le parcours d'un fichier XML se fait avec la syntaxe Xpath, qui comme souvent plusieurs chemin mène à Rome.
Pour ton fichier XML, le Xpath de la chaine à modifier: $XPath = ""

Code : Tout sélectionner

; Création de l'objet et ouverture du XML
Global $PathXML = "Paths.xcu"

Global $xmlDoc = ObjCreate("Msxml2.DOMDocument.6.0")
With $xmlDoc
    .setProperty("SelectionNamespaces", "xmlns:oor='http://openoffice.org/2001/registry'")
    .load($PathXML)
EndWith
ConsoleWrite($xmlDoc.xml & @LF)

;~ Selection de la node avec XPath
Global $XPath = "//*/prop[@oor:name='WritePath']/value"
Global $Node = $xmlDoc.SelectSingleNode($XPath)
;~ Lecture de la valeur, propriété text de la node
Global $Path = $Node.text
ConsoleWrite($Path & @LF)
Global $DriveOld = StringMid($Path, 9, 2)
ConsoleWrite($DriveOld & @LF)
;~ mise à jour de la valeur
$Node.text = StringReplace($Path, $DriveOld, StringLeft(@ScriptDir, 2))
ConsoleWrite($Node.text & @LF)
;~ Ecriture/sauvegarde du fichier xml
$xmlDoc.save($PathXML)
ConsoleWrite($xmlDoc.xml & @LF)

;~ Même chose, je restaure la valeur, ici sans passer par XPath, on compte les enfants et on choisis le 1er
Global $Node = $xmlDoc.documentElement.firstChild.firstChild.firstChild.firstChild
Global $Path = $Node.text
ConsoleWrite($Path & @LF)
Global $Drive = StringLeft(@ScriptDir, 2)
ConsoleWrite($Drive & @LF)
$Node.text = StringReplace($Path, $Drive, $DriveOld)
ConsoleWrite($Node.text & @LF)
$xmlDoc.save($PathXML)
ConsoleWrite($xmlDoc.xml & @LF)
Plus simple, plus sur et tu pourras même lire et écrire plusieurs éléments dans ton fichier.

Explication du XPath, tu en trouveras des exemples sur le net, mais dans ce cas je choisis la 1ère node qui s'appelle "prop", dont un attribut s'appelle oor:name dont la valeur est 'WritePath', puis je sélection un enfant qui s'appelle "value", à ce moment je suis sur le noeud (la node $Node)

Code : Tout sélectionner

Global $XPath = "//*/prop[@oor:name='WritePath']/value"
Global $Node = $xmlDoc.SelectSingleNode($XPath)
<value>file:///F:/LiberKey/MyDocuments</value>
, $Node.text me donne le contenue texte de cette node. Je t'invite à visiter le site microsoft sur la doc de msxml, tu dois même avoir le fichier d'aide sur ton micro "xmlsdk4.chm".

Ensuite aprés ca il n' y a pas de gestion des erreurs, lecture des attributs, création etc, j'ai trouvé une UDF que j'ai bcp modifié pour utiliser les fichiers xml mais c'est pas encore finalisé.

Re: [..] Changer texte dans un fichier xcu

Posté : ven. 04 févr. 2011 13:07
par PetitBean
Bonjour,

FernandG : Merci pour les infos j'en prends note et je vais étudier le fichier "File.au3". Je suis pas tout à fait "débutant" je développe un peu en php. Mais je connais pas du tout AutoIt. Mais j'ai regardé pas mal de script et testé certaines choses avant de mettre mon ptit script.

GaRydelaMer : Merci beaucoup de votre réponse, je vais étudier, avec la plus grande attention, votre réponse. Et je pense que j'aurais des questions à vous poser !!!

Aller c'est parti !!!

Merci beaucoup !!