Page 1 sur 1

[R]Lister les fichiers par propriétaire et trier par taille

Posté : mer. 06 févr. 2019 10:28
par corrs78
Bonjour,
je ne trouve pas comment lister les fichiers récursivement (d'un serveur de fichier) appartenant à un utilisateur en particulier.
la fonction FileListToArrayRec semblait idéale, mais malheureusement on ne peut pas chercher par attribut ou propriété d'un fichier.
On peut pas non plus récupérer le poids de chaque fichier dans ce joli tableau :(

L'objectif est de donner un rapport/fichier csv à mes utilisateurs qui liste tous les fichiers dont ils sont propriétaires, ceci afin de visualiser rapidement quels gros fichiers impacte leur "quota user" sur le serveur.

J'ai fait un script powershell, mais c'est pas idéal surtout coté user :/

Code : Tout sélectionner

$date=Get-Date
[String]$username = "utilisateur"
[String]$outfile = "C:\temp\"+$date.Year+"_"+$date.Month+"_"+$date.Day+"_"+"searchowner.csv"
$path = Get-ChildItem "\\MON-SERVEUR\MES-DATA\" -Recurse
$poids = 0

Foreach( $file in $path ) {
  $f = Get-Acl $file.FullName
  
  
  if( $f.Owner -eq $username ) {
    $poids1=$file.length/1024
    Write-Host( "{0}"-f $file.FullName+';'+[Math]::Floor($poids1) | Out-File `
    -Encoding "UTF8" `
      -FilePath $outfile -Append      
      )

        $poids = $poids + $poids1

      }
    
}
Write-Host( "{0}"-f 'Total :'+';'+[Math]::Floor($poids) | Out-File `
      -Encoding "UTF8" `
      -FilePath $outfile -Append
      
      )
 
voici la propriété du fichier qui m'intéresse pour faire ce tri, hormis la taille.
Image

Auriez-vous une piste de réflexion à m'apporter ? Merci à vous

Re: [..]Lister les fichiers par propriétaire et trier par taille

Posté : mer. 06 févr. 2019 15:24
par walkson
Bonjour,
On peut utiliser FileListToArrayRec() en complétant le tableau

Code : Tout sélectionner

#include <Array.au3>
#include <File.au3>

$folder = FileSelectFolder("Folder",@DesktopDir,0,"")
If @error Then Exit
$aArray = _FileListToArrayRec($folder,"*|*.lnk",$FLTAR_FILES,$FLTAR_RECUR ,0,2)
If Not IsArray($aArray) Then Exit MsgBox(0,"","erreur")
_ArrayColInsert ($aArray,1)
_ArrayColInsert ($aArray,2)
_ArrayColInsert ($aArray,3)

For $i = 1 To $aArray[0][0]
	$attribut = FileGetAttrib($aArray[$i][0])
	$proprio = _FileGetDetails($aArray[$i][0], 10)
	$poids = FileGetSize($aArray[$i][0])
	$aArray[$i][1] = $attribut
	$aArray[$i][2] = $proprio
	$aArray[$i][3] = $poids
Next
_ArraySort($aArray,1,1,0,3)
_ArrayDisplay($aArray)
$aArrayUnique = _ArrayUnique($aArray, 2)
_ArrayDisplay($aArrayUnique)
Local $csv
For $i = 1 To $aArrayUnique[0]
	For $y = 1 To $aArray[0][0]
	If $aArrayUnique[$i] = $aArray[$y][2] Then
		$csv &= $aArray[$y][0] &";"& $aArray[$y][1] &";"& $aArray[$y][2] &";"& Round($aArray[$y][3]/1024,2) & "Ko" & @CRLF
	EndIf
	Next
	FileWrite(StringReplace($aArrayUnique[$i],"\","-") & "table.csv",$csv)
	$csv = ""
Next


Func _FileGetDetails($File,$item)
	$File = FileGetLongName (StringStripWS($File,1))
	$File = StringStripWS($File,2)
   If Not FileExists($File) Then Return SetError(4)
   $objShell = ObjCreate("Shell.Application")
   If @error Then Return SetError(2)
   $Path = StringLeft($File, StringInStr($File, "\", 0, -1) -1)
   $fName = StringMid($File, StringInStr($File, "\", 0, -1) +1)
   $objFolder = $objShell.Namespace($Path)
   Local $dt
   For $Filename In $objFolder.Items

	  If $objFolder.GetDetailsOf($Filename, 0) = $fName Then $dt =  $objFolder.GetDetailsOf($Filename, $item)


   Next
   If $dt = "" Then Return ""
   $objShell = 0
   Return $dt
EndFunc  ;<==> _FileGetDetails($File)
J'utilise Func _FileGetDetails($File,$item) pour retrouver la propriété d'un document et tous les attributs. J'utilise cette fonction pour connaitre par exemple la longueur d'une vidéo
0  Nom >>> ASS-06-2018.pdf
1  Taille >>> 44,2 Ko
2  Type d’élément >>> Document PDF
3  Modifié le >>> 26/06/2018 16:14
4  Date de création >>> 26/06/2018 16:14
5  Date d’accès >>> 26/06/2018 16:14
6  Attributs >>> AI
7  État hors connexion >>>
8  Hors connexion >>>
9  Type identifié >>> Non spécifié
10  Propriétaire >>> PC-PC\PC
11  Sorte >>> Documents
12  Prise de vue >>>
13  Artistes ayant participé >>>
14  Album >>>
15  Année >>>
16  Genre >>>
17  Chefs d’orchestre >>>
18  Mots-clés >>>
19  Notation >>> Non classé
20  Auteurs >>>
21  Titre >>>
22  Objet >>>
23  Catégories >>>
24  Commentaires >>>
25  Copyright >>>
26  N° >>>
27  Longueur >>>
28  Vitesse de transmission >>>
Cette fonction vous donnera la liste complète comme ci-dessus (286 attributs)
Func _FileGetDetailsAll($File);; $File is the Full path and file name if the file to check.GEOSoft
   $objShell = ObjCreate("Shell.Application")
   $Path = StringLeft($File, StringInStr($File, "\", 0, -1) -1)
   $fName = StringMid($File, StringInStr($File, "\", 0, -1) +1)
   $objFolder = $objShell.Namespace($Path)
   $objVerbs = $objFolder.Self.Verbs
   Local $dt, $dt1
   For $Filename In $objFolder.Items
      For $i = 0 To 287
     If $objFolder.GetDetailsOf($Filename, 0) = $fName Then  $dt &= $i & "  " & $objFolder.GetDetailsOf(Null, $i) &" >>> "&  $objFolder.GetDetailsOf($Filename, $i)  & @CRLF
     Next

   Next
FileDelete(@ScriptDir & "\objFolder.txt")
FileWrite(@ScriptDir & "\objFolder.txt",$dt)
ShellExecute(@ScriptDir & "\objFolder.txt")
EndFunc  ;<==> _FileGetDetailsAll($File)

Re: [..]Lister les fichiers par propriétaire et trier par taille

Posté : mer. 06 févr. 2019 15:58
par corrs78
Merci c'est parfait.
Maintenant j'essaie de digérer tout ça, et il y a une partie que je ne comprends pas c'est la boucle FOR imbriquée avec la fonction _ArrayUnique. Pourquoi chercher les doublons ?

Merci d'éclairer ma lanterne.

Re: [..]Lister les fichiers par propriétaire et trier par taille

Posté : mer. 06 févr. 2019 16:05
par walkson
J'ai supposé qu'il y avait plusieurs propriétaires.
Si ce n'est pas utile, supprimez ! :wink:

Re: [..]Lister les fichiers par propriétaire et trier par taille

Posté : mer. 06 févr. 2019 16:56
par corrs78
Ha non un fichier ne peut avoir qu'un unique propriétaire.

Maintenant me reste à lister un propriétaire défini au lancement du script.

Merci pour tout.