Question
Rediriger la sortie d'un script dans Excel(Résolu)
- Berfini
- Auteur du sujet
- Hors Ligne
- Membre premium
-
Réduire
Plus d'informations
- Messages : 86
- Remerciements reçus 0
il y a 16 ans 2 mois #763
par Berfini
Gaby
Rediriger la sortie d'un script dans Excel(Résolu) a été créé par Berfini
LE but de mon script est d'afficher le contenu de chaque sous repertoire d'un repertoire donné, les fichiers qu'ils contiennent et leurs taille.
J'ai donc crée une fonction qui écrit dans mon fichier.
[code:1]Function WriteFile ($repertoire, $fichier, $ligne) {
$xls = New-Object -ComObject Excel.Application
$classeur=$xls.workbooks.open(\"c:\analyse repertoire2.xls\"«»)
$feuille=$classeur.worksheets.item(1)
$taille = $fichier.length
$feuille.cells.item($ligne,1)=$repertoire
$feuille.cells.item($ligne,2)=$fichier
$feuille.cells.item($ligne,3)=$taille
$classeur.save()
}[/code:1]
Mais d'une il me l'ouvre en lecture seule et ne peux pas l'enregistrer, et de deux il me marque tout sur la meme ligne, malgrès mon $ligne++ dans ma boucle.
Help me please.<br><br>Message édité par: Arnaud, à: 1/08/07 18:07
J'ai donc crée une fonction qui écrit dans mon fichier.
[code:1]Function WriteFile ($repertoire, $fichier, $ligne) {
$xls = New-Object -ComObject Excel.Application
$classeur=$xls.workbooks.open(\"c:\analyse repertoire2.xls\"«»)
$feuille=$classeur.worksheets.item(1)
$taille = $fichier.length
$feuille.cells.item($ligne,1)=$repertoire
$feuille.cells.item($ligne,2)=$fichier
$feuille.cells.item($ligne,3)=$taille
$classeur.save()
}[/code:1]
Mais d'une il me l'ouvre en lecture seule et ne peux pas l'enregistrer, et de deux il me marque tout sur la meme ligne, malgrès mon $ligne++ dans ma boucle.
Help me please.<br><br>Message édité par: Arnaud, à: 1/08/07 18:07
Gaby
Connexion ou Créer un compte pour participer à la conversation.
- Robin Lemesle
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 260
- Remerciements reçus 0
il y a 16 ans 2 mois #765
par Robin Lemesle
Robin MVP PowerShell
Réponse de Robin Lemesle sur le sujet Re:Rediriger sortie dans un fichier excel
Salut Gaby 
En effet, la méthode \"open\" peut être utilisée avec de nombreux arguments ...
(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU)
rien que ca.
Alors dans un premier temps tu peux essayer de l'ouvrir avec l'argument ReadOnly = \"False\" et UpdateLinks = 0.
je n'ai pas de quoi tester maintenant, mais je vais essayer de faire la manip.
Rob<br><br>Message édité par: robin, à: 26/07/07 17:26

En effet, la méthode \"open\" peut être utilisée avec de nombreux arguments ...
(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU)
rien que ca.
Alors dans un premier temps tu peux essayer de l'ouvrir avec l'argument ReadOnly = \"False\" et UpdateLinks = 0.
je n'ai pas de quoi tester maintenant, mais je vais essayer de faire la manip.
Rob<br><br>Message édité par: robin, à: 26/07/07 17:26
Robin MVP PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 16 ans 2 mois #768
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Rediriger sortie dans un fichier excel
Eventuellement, montre-nous tout le code, car là tu nous parles d'une boucle avec $ligne++ mais on ne la voit pas.
De plus, recréer un objet COM pour chaque ligne ne me paraît pas formidable: c'est gourmand en ressources, côté performances c'est très moyen, et comme tu ne le ferme pas entre deux manips (en tout cas pas dans le code que tu nous montres) c'est un peu normal qu'il soit en lecture seule dès la 2e tentative d'ouverture...
En fait, personnellement j'aurais opté pour l'écriture de tes données dans un tableau que j'aurais ensuite exporté au format CSV: facilement réimportable dans PowerShell ou n'importe quelle autre appli, y compris Excel.
Janel
De plus, recréer un objet COM pour chaque ligne ne me paraît pas formidable: c'est gourmand en ressources, côté performances c'est très moyen, et comme tu ne le ferme pas entre deux manips (en tout cas pas dans le code que tu nous montres) c'est un peu normal qu'il soit en lecture seule dès la 2e tentative d'ouverture...
En fait, personnellement j'aurais opté pour l'écriture de tes données dans un tableau que j'aurais ensuite exporté au format CSV: facilement réimportable dans PowerShell ou n'importe quelle autre appli, y compris Excel.
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Berfini
- Auteur du sujet
- Hors Ligne
- Membre premium
-
Réduire
Plus d'informations
- Messages : 86
- Remerciements reçus 0
il y a 16 ans 2 mois #772
par Berfini
Gaby
Réponse de Berfini sur le sujet Re:Rediriger sortie dans un fichier excel
Pour le moment je vais tester ta methode janel, donc j'ai viré toute la partie excel, mais j'ai un pb, ce script ne m'affiche rien :
[code:1]Function WriteArray ($repertoire, $fichier, $ligne, $tab) {
$taille = $fichier.length
$tab[$ligne] = $repertoire + ',' + $fichier + ',' + $taille
}
Function ShowFileList($folderspec, $ligne, $tab) {
[string]$path2 = $folderspec
$path = $path2 + \"\\"
Set-location $path
get-childitem | foreach { if ($_.mode[1] -like \"a\"«») { WriteArray $path $_ $ligne $tab ; $ligne++ } }
}
Function ShowFolderList($folderspec, $ligne, $tab) {
[string]$path2 = $folderspec
$path = $path2 + \"\\"
Set-location $path
get-childitem -recurse | foreach { if ($_.mode[0] -like \"d\"«») { ShowFileList $_ $ligne $tab } }
}
$tab=@{}
$sfolderspec=\"C:\Documents and Settings\SBerfini\Mes documents\"
$sNomFichier=\"c:\analyse repertoire.xls\"
$ligne = 1
ShowFolderList($sfolderspec, $ligne, $tab)
ShowFileList($sfolderspec, $ligne, $tab)
$tab[/code:1]
[code:1]Function WriteArray ($repertoire, $fichier, $ligne, $tab) {
$taille = $fichier.length
$tab[$ligne] = $repertoire + ',' + $fichier + ',' + $taille
}
Function ShowFileList($folderspec, $ligne, $tab) {
[string]$path2 = $folderspec
$path = $path2 + \"\\"
Set-location $path
get-childitem | foreach { if ($_.mode[1] -like \"a\"«») { WriteArray $path $_ $ligne $tab ; $ligne++ } }
}
Function ShowFolderList($folderspec, $ligne, $tab) {
[string]$path2 = $folderspec
$path = $path2 + \"\\"
Set-location $path
get-childitem -recurse | foreach { if ($_.mode[0] -like \"d\"«») { ShowFileList $_ $ligne $tab } }
}
$tab=@{}
$sfolderspec=\"C:\Documents and Settings\SBerfini\Mes documents\"
$sNomFichier=\"c:\analyse repertoire.xls\"
$ligne = 1
ShowFolderList($sfolderspec, $ligne, $tab)
ShowFileList($sfolderspec, $ligne, $tab)
$tab[/code:1]
Gaby
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 16 ans 2 mois #773
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Rediriger sortie dans un fichier excel
Il y a plusieurs problèmes à mon avis.
Principalement, si le script n'affiche rien c'est à priori dû au fait que tu passes la variable $tab aux fonctions pour qu'elles la modifient, mais les fonctions ont par défaut un contexte d'exécution qui leur est propre. Donc, lorsqu'une fonction manipule une variable $tab ce n'est pas la même variable $tab que celle que tu affiches à la fin. Donc celle-ci n'est finalement jamais modifiée, d'où le fait qu'elle soit vide.
Pour t'en sortir dans une telle situation, tu as plusieurs possibilités, comme par exemple:
1. Faire comme pour l'appel à un script: retourner la variable en fin de fonction, et récupérer cette variable comme valeur de retour lors de son appel. Un exemple tout bête:
[code:1]
PS> function ajouter ($num1, $num2) {
>> $somme = $num1 + $num2
>> $somme
>> }
>>
PS> $total = ajouter 10 5
PS> $total
15[/code:1]
2. Déclarer la variable $tab comme globale dans chaque fonction, ce qui permet à la fonction de modifier la variable $tab existante et non pas une nouvelle variable qui lui est propre. Exemple:
[code:1]
PS> function ajouter ($num) {$global:total += $num}
PS> ajouter 10
PS> $total
10
PS> ajouter 5
PS> $total
15[/code:1]
Dans cet exemple, tu vois bien que $total est toujours la même variable que ce soit dans ou en dehors de la fonction.
Tu noteras également qu'avec cette technique, tu n'as plus besoin de passer $tab en paramètre de ta fonction puisque la fonction \"sait\" qu'elle doit utiliser la variable $tab globale.
Cette technique est à manier avec précaution car il faut toujours savoir précisément quelle(s) variable(s) on manipule. Il vaut mieux opter pour la première solution, plus simple et plus granulaire: une fonction retourne une valeur, point à la ligne.
Il y aurait encore d'autres solutions (notamment le passage d'une variable en référence) mais je n'en parlerai pas ici, pas trop le temps ce matin
Pour en revenir à ton script, je crois que même en réglant ce problème de $tab tu te compliques la vie fortement avec tes trois fonctions dont celle récursive qui explore les répertoires. Pourquoi ne pas tout simplement faire appel aux commandelettes standard qui font tout ça très bien?
[code:1]
# export-fileinfo.ps1
# $root = répertoire racine
# $file = fichier récupérant le résultat
# $rec = récursif ou non ($false par défaut)
param ($root, $file, [switch]$rec)
dir $root -rec:$rec | where {$_.mode -match \"a\"} | select directory,name,length | export-csv $file -notype[/code:1]
Exemple d'usage:
[code:1]
PS> export-fileinfo c:\users c:\logs\userfiles.txt -rec[/code:1]
Est-ce que ça correspond à ce que tu veux faire?
Janel
Principalement, si le script n'affiche rien c'est à priori dû au fait que tu passes la variable $tab aux fonctions pour qu'elles la modifient, mais les fonctions ont par défaut un contexte d'exécution qui leur est propre. Donc, lorsqu'une fonction manipule une variable $tab ce n'est pas la même variable $tab que celle que tu affiches à la fin. Donc celle-ci n'est finalement jamais modifiée, d'où le fait qu'elle soit vide.
Pour t'en sortir dans une telle situation, tu as plusieurs possibilités, comme par exemple:
1. Faire comme pour l'appel à un script: retourner la variable en fin de fonction, et récupérer cette variable comme valeur de retour lors de son appel. Un exemple tout bête:
[code:1]
PS> function ajouter ($num1, $num2) {
>> $somme = $num1 + $num2
>> $somme
>> }
>>
PS> $total = ajouter 10 5
PS> $total
15[/code:1]
2. Déclarer la variable $tab comme globale dans chaque fonction, ce qui permet à la fonction de modifier la variable $tab existante et non pas une nouvelle variable qui lui est propre. Exemple:
[code:1]
PS> function ajouter ($num) {$global:total += $num}
PS> ajouter 10
PS> $total
10
PS> ajouter 5
PS> $total
15[/code:1]
Dans cet exemple, tu vois bien que $total est toujours la même variable que ce soit dans ou en dehors de la fonction.
Tu noteras également qu'avec cette technique, tu n'as plus besoin de passer $tab en paramètre de ta fonction puisque la fonction \"sait\" qu'elle doit utiliser la variable $tab globale.
Cette technique est à manier avec précaution car il faut toujours savoir précisément quelle(s) variable(s) on manipule. Il vaut mieux opter pour la première solution, plus simple et plus granulaire: une fonction retourne une valeur, point à la ligne.
Il y aurait encore d'autres solutions (notamment le passage d'une variable en référence) mais je n'en parlerai pas ici, pas trop le temps ce matin

Pour en revenir à ton script, je crois que même en réglant ce problème de $tab tu te compliques la vie fortement avec tes trois fonctions dont celle récursive qui explore les répertoires. Pourquoi ne pas tout simplement faire appel aux commandelettes standard qui font tout ça très bien?
[code:1]
# export-fileinfo.ps1
# $root = répertoire racine
# $file = fichier récupérant le résultat
# $rec = récursif ou non ($false par défaut)
param ($root, $file, [switch]$rec)
dir $root -rec:$rec | where {$_.mode -match \"a\"} | select directory,name,length | export-csv $file -notype[/code:1]
Exemple d'usage:
[code:1]
PS> export-fileinfo c:\users c:\logs\userfiles.txt -rec[/code:1]
Est-ce que ça correspond à ce que tu veux faire?
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Berfini
- Auteur du sujet
- Hors Ligne
- Membre premium
-
Réduire
Plus d'informations
- Messages : 86
- Remerciements reçus 0
il y a 16 ans 2 mois #776
par Berfini
Gaby
Réponse de Berfini sur le sujet Re:Rediriger sortie dans un fichier excel
Super janel c'est exactement ça, mais maintenant comme je fais pour mettre ça dans des colonnes sur un tableau excel ?
Gaby
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.051 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Rediriger la sortie d'un script dans Excel(Résolu)