Question Rediriger la sortie d'un script dans Excel(Résolu)

Plus d'informations
il y a 16 ans 8 mois #763 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

Gaby

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 8 mois #765 par Robin Lemesle
Salut Gaby :)

En effet, la méthode \&quot;open\&quot; 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 = \&quot;False\&quot; 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.

Plus d'informations
il y a 16 ans 8 mois #768 par Jacques Barathon
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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 8 mois #772 par Berfini
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 + \&quot;\\&quot;
Set-location $path
get-childitem | foreach { if ($_.mode[1] -like \&quot;a\&quot;«») { WriteArray $path $_ $ligne $tab ; $ligne++ } }
}

Function ShowFolderList($folderspec, $ligne, $tab) {
[string]$path2 = $folderspec
$path = $path2 + \&quot;\\&quot;
Set-location $path
get-childitem -recurse | foreach { if ($_.mode[0] -like \&quot;d\&quot;«») { ShowFileList $_ $ligne $tab } }
}

$tab=@{}
$sfolderspec=\&quot;C:\Documents and Settings\SBerfini\Mes documents\&quot;
$sNomFichier=\&quot;c:\analyse repertoire.xls\&quot;
$ligne = 1
ShowFolderList($sfolderspec, $ligne, $tab)
ShowFileList($sfolderspec, $ligne, $tab)
$tab[/code:1]

Gaby

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 8 mois #773 par Jacques Barathon
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&gt; function ajouter ($num1, $num2) {
&gt;&gt; $somme = $num1 + $num2
&gt;&gt; $somme
&gt;&gt; }
&gt;&gt;
PS&gt; $total = ajouter 10 5
PS&gt; $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&gt; function ajouter ($num) {$global:total += $num}
PS&gt; ajouter 10
PS&gt; $total
10
PS&gt; ajouter 5
PS&gt; $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 \&quot;sait\&quot; 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 \&quot;a\&quot;} | select directory,name,length | export-csv $file -notype[/code:1]
Exemple d'usage:

[code:1]
PS&gt; 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.

Plus d'informations
il y a 16 ans 8 mois #776 par Berfini
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.076 secondes
Propulsé par Kunena