Question
Aide PS V2 - V3
- Fred
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 10
- Remerciements reçus 0
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
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.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
tu installe la V4 !... (ok je sors)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...).
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 !
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
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.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
mais j'ai pas compris !
j'ai testé ceci en V2 :
[code:1]
$profiles = gci \"$env:USERPROFILE\AppData\Roaming\Microsoft\HTML Help\"
$Profile0 = @($Profiles[0])
[/code:1]
mais ça marche pas !!!
[code:1]
Impossible d'indexer dans un objet de type System.IO.FileInfo.
Au niveau de ligne : 1 Caractère : 24
+ $Profile = @($Profiles[ <<<< 0])
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Fred
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 10
- Remerciements reçus 0
Merci.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
La construction englobe le code dont le résultat est affecté à une variable :mais ça marche pas !!!
[code:1]
$profiles = @ ( gci \"$env:USERPROFILE\AppData\Roaming\Microsoft\HTML Help\" )
[/code:1]
6ratgus écrit:
Oui, mais on peut aussi lire, si on a le temps, les spécifications de Ps v3 :ah l'expérience
Ensuite, le pb est de se souvenir de cette passionnante lecture7.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.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Aide PS V2 - V3