Question Aide PS V2 - V3

Plus d'informations
il y a 10 ans 7 mois #20656 par Fred
Aide PS V2 - V3 a été créé par Fred
Bonjour,
En shadockant sur le net et à l'aide quelques blogs, j'ai édité le script suivant.
Ce script permet d'envoyer dans un fichier csv la taille des profils de dossiers de Thunderbird sous $env:USERPROFILE\AppData\Roaming\Thunderbird\profiles.
J'ai cependant le problème suivant.
Dans le cas ou je n'ai qu'un seul dossier, ce script est fonctionnel avec PS V3, avec la V2 j'ai l'erreur suivante :

[code:1]Impossible d'indexer dans un objet de type System.IO.DirectoryInfo.
Au niveau de TailleThunderbird.ps1 : 28 Caractère : 36
+ $ProfilSize = getDirSize $Profiles[ <<<< 0].FullName 2>$null
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex[/code:1]

Ma question est donc, comment simplement contourner ce problème d'incompatibilité V2 sans avoir à installer le framework V3 sur les PC (on ne fait pas toujours ce qu'on veut sur un parc...).

PS : je sais, je n'utilise pas la fonction :p

Le script :
[code:1]
clear
$TabThun = $null
write-host $env:USERPROFILE\AppData\Roaming\Thunderbird

function getDirSize {
param ([string]$chemin)

$i=0
gci $chemin -recurse -force| foreach -process {$i+=$_.length}
return $i
}


<# function addUser {
param([string]$chemin,[string]$Dossier,[string]$Taille,[string]$TailleMo,[string]$DateModifDir)
$d=New-Object PSObject
$d | Add-Member -Name Chemin -MemberType NoteProperty -Value $Chemin
$d | Add-Member -Name Dossier -MemberType NoteProperty -Value $Dossier
$d | Add-Member -Name Taille -MemberType NoteProperty -Value $Taille
$d | Add-Member -Name TailleMo -MemberType NoteProperty -Value $TailleMo
$d | Add-Member -Name DateModifDir -MemberType NoteProperty -Value $DateModifDir
return $PSObject
}
#>

$profiles = gci $env:USERPROFILE\AppData\Roaming\Thunderbird\profiles

$ProfilSize = getDirSize $Profiles[0].FullName 2>$null
$ProfilSizeMo = $profilSize/(1024*1024)
$ProfilSizeMo = [math]::round($ProfilSizeMo,0)
$LWT = $Profiles[0].LastWriteTime

$PSObject = New-Object PSObject
$PSObject | Add-Member -Name Chemin -MemberType NoteProperty -Value \"$($Profiles[0].Fullname)\"
$PSObject | Add-Member -Name Dossier -MemberType NoteProperty -Value \"$($Profiles[0])\"
$PSObject | Add-Member -Name Taille -MemberType NoteProperty -Value \"$ProfilSize\"
$PSObject | Add-Member -Name TailleMo -MemberType NoteProperty -Value \"$ProfilSizeMo\"
$PSObject | Add-Member -Name DateModifDir -MemberType NoteProperty -Value \"$LWT\"

$TabThun = @()
$TabThun += $PSObject


foreach ($item in $profiles)
{
write-host -ForegroundColor Red \"`n $item\"
if ($item -ne $Profiles[0])
{
write-host \"`nBoucle IF $item\"
$ProfilSize = getDirSize $item.FullName 2>$null
$ProfilSizeMo = $profilSize/(1024*1024)
$ProfilSizeMo = [math]::round($ProfilSizeMo,0)
$LWT = $item.LastWriteTime
Write-Host $item $ProfilSize $ProfilSizeMo $LWT

#$TabThun += addUser -Chemin \"$($item.Fullname)\" -Dossier \"$item\" -Taille \"$ProfilSize\" -TailleMos \"$ProfilSizeMo\" -DateModifDir \"$LWT\"

$d=New-Object PSObject
$d | Add-Member -Name Chemin -MemberType NoteProperty -Value $($item.Fullname)
$d | Add-Member -Name Dossier -MemberType NoteProperty -Value $item
$d | Add-Member -Name Taille -MemberType NoteProperty -Value $ProfilSize
$d | Add-Member -Name TailleMo -MemberType NoteProperty -Value $ProfilSizeMo
$d | Add-Member -Name DateModifDir -MemberType NoteProperty -Value $DateModifDir
$TabThun += $d
}

}


[/code:1]

Les messages d'erreur :

Impossible d'indexer dans un objet de type System.IO.DirectoryInfo.
Au niveau de TailleThunderbird.ps1 : 28 Caractère : 36
+ $ProfilSize = getDirSize $Profiles[ <<<< 0].FullName 2>$null
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex

Impossible d'indexer dans un objet de type System.IO.DirectoryInfo.
Au niveau de TailleThunderbird.ps1 : 31 Caractère : 18
+ $LWT = $Profiles[ <<<< 0].LastWriteTime
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex

Impossible d'indexer dans un objet de type System.IO.DirectoryInfo.
Au niveau de TailleThunderbird.ps1 : 34 Caractère : 11
+ $Profiles[ <<<< 0].Fullname
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex

Impossible d'indexer dans un objet de type System.IO.DirectoryInfo.
Au niveau de TailleThunderbird.ps1 : 35 Caractère : 11
+ $Profiles[ <<<< 0]
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex


aive74om.default
Impossible d'indexer dans un objet de type System.IO.DirectoryInfo.
Au niveau de TailleThunderbird.ps1 : 47 Caractère : 29
+ if ($item -ne $Profiles[ <<<< 0])
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex


_____________________________________________________

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

Plus d'informations
il y a 10 ans 7 mois #20658 par Philippe
Réponse de Philippe sur le sujet Re:Aide PS V2 - V3
Salut Fred124

Dans le cas ou je n'ai qu'un seul dossier, ce script est fonctionnel avec PS V3, avec la V2 j'ai l'erreur suivante :
......
Ma question est donc, comment simplement contourner ce problème d'incompatibilité V2 sans avoir à installer le framework V3 sur les PC (on ne fait pas toujours ce qu'on veut sur un parc...).

tu installe la V4 !... (ok je sors)

sérieux, en V1/2 on ne pouvais pas indexé un objet avec 1 seul élément, alors qu'en v3 ou plus oui

une première correction peut être faite en remplacent tous les $profiles[0] par $profiles0 et en rajoutent
[code:1]if ($Profiles.count -eq $null -or $profiles.count -eq 1) {
$Profile0 = $Profiles
}
else {
$Profile0 = $Profiles[0]
}
[/code:1]
juste après cette ligne :
[code:1]$profiles = gci $env:USERPROFILE\AppData\Roaming\Thunderbird\profiles[/code:1]

et sauf erreur ce sera la seule correction ! B)<br><br>Message édité par: 6ratgus, à: 21/08/15 10:28

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

Plus d'informations
il y a 10 ans 7 mois #20661 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Aide PS V2 - V3
Salut,
la construction suivante règle le pb pour toutes les versions :
[code:1]
$Var=@( ...code ...)
[/code:1]
On s'assure d'avoir dans tous les cas un tableau d'objet, même un tableau vide.

Tutoriels PowerShell

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

Plus d'informations
il y a 10 ans 7 mois #20662 par Philippe
Réponse de Philippe sur le sujet Re:Aide PS V2 - V3
ah l'expérience

mais j'ai pas compris !

j'ai testé ceci en V2 :

[code:1]
$profiles = gci \&quot;$env:USERPROFILE\AppData\Roaming\Microsoft\HTML Help\&quot;
$Profile0 = @($Profiles[0])
[/code:1]
mais ça marche pas !!! :blink:
[code:1]
Impossible d'indexer dans un objet de type System.IO.FileInfo.
Au niveau de ligne : 1 Caractère : 24
+ $Profile = @($Profiles[ &lt;&lt;&lt;&lt; 0])
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
[/code:1]

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

Plus d'informations
il y a 10 ans 7 mois #20663 par Fred
Réponse de Fred sur le sujet Re:Aide PS V2 - V3
J'ai appliqué ta solution, ca marche nickel.
Merci.

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

Plus d'informations
il y a 10 ans 7 mois #20667 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Aide PS V2 - V3
6ratgus écrit:

mais ça marche pas !!! :blink:

La construction englobe le code dont le résultat est affecté à une variable :
[code:1]
$profiles = @ ( gci \&quot;$env:USERPROFILE\AppData\Roaming\Microsoft\HTML Help\&quot; )
[/code:1]
6ratgus écrit:

ah l'expérience

Oui, mais on peut aussi lire, si on a le temps, les spécifications de Ps v3 :

7.1.7 @(…) operator

Syntax:
array-expression:
@( new-linesopt statement-listopt new-linesopt )

Description:
If statement-list is omitted, the result is an unconstrained 1-dimensional array of length zero. Otherwise, statement-list is evaluated, and any objects written to the pipeline as part of the evaluation are collected in an unconstrained 1-dimensional array, in order. The result is the (possibly empty) unconstrained 1-dimensional array.

Ensuite, le pb est de se souvenir de cette passionnante lecture :P

Tutoriels PowerShell

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

Temps de génération de la page : 0.059 secondes
Propulsé par Kunena