none
Split d'une String vers tableau RRS feed

  • Question

  • Bonjour,

    J'extrais une ligne d'un fichier .log ROBOCOPY,

    "
                   Total     Copié    IgnoréDiscordance     ÉCHEC    Extras
         Rép :         2         0         0         0         0         3
    Fichiers :        16         2        14         0         0         2
      Octets :    22.3 k     2.7 k    19.6 k         0         0     2.9 k

    "

    J'enlève la partie du début "Fichiers :"

    $LigneFichiers=($ligne2.Substring(12)) #Supprime le mot "Fichiers :"

    et je me retrouve avec la ligne  16         2        14         0         0         2


    Je veux séparer chaque groupes de chiffres en 5 variables (a,b,c,d,e) par exemple

    Quand je veux spliter la variable $LigneFichiers par le biais

    $test=$LigneFichiers.split(' ')

    $test1=$LigneFichiers.split([char]0x0020)

    $test2=$LigneFichiers.split('U+0009')


    Quand je fais les essais pour $test et $test1

    Je peux donc pas faire $test[1] etc...

    Quand je fais un .COUNT je comprend mieux pourquoi en regardant le nombre de caractères de $Test et $test1

    Quand je regarde la variable $test2 elle semble presque bonne mais un groupe échappe à mon split

    Quelqu'un à une solution ?

    Merci d'avance,

    Cordialement,

    mardi 24 mai 2016 08:21

Toutes les réponses

  • Salut,
    une piste :

    #                     Total     Copié    IgnoréDiscordance     ÉCHEC    Extras
    #Robocopy texte Fr
    $File='Fichiers :        16         2        14         0         0         2'
    #regex texte Fr et US
    $Regex='(Fichiers|Files) :\s*(?<Total>\d{1,10})\s*(?<Copie>\d{1,10})\s*(?<IgnoreDiscordance>\d{1,10})\s*(?<ECHEC>\d{1,10})\s*(?<Extras>\d{1,10})'
    $Object=$null
    if ($File -match $Regex)
    {
     $Matches
     $matches.Remove(0)#all
     $matches.Remove(1) #fichier/files
     $Object=New-Object PSCustomObject -Property $Matches
     $Object.PsObject.TypeNames.Insert(0,'RobocopyInfo')
     $Object
    }
    else
    {Throw "Jeu de test à revoir pour :\r\n$File\r\n$Regex" }
    
    $Object|gm
    
    Il reste à déterminer les 2 nombres qui n'ont pas de header ( 'Total  Copié...).

    Beatus, qui prodest, quibus potest.

    jeudi 26 mai 2016 10:20
    Modérateur
  • Hello,

    Une piste, Je m'en sers pour récupérer les files failed après un robocopy, tu devrais pouvoir partir de là

    Function GetFrom-RobocopyLog-Files {
        Param (
            [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,Position=0)]
            [String]$LogFile
        )
            $Header = Get-Content $LogFile | select -First 10
            $Footer = Get-Content $LogFile | select -Last 7

            $Header | ForEach-Object {
                if ($_ -like "*Source*") {$Source = (($_.Split(':'))[1]).trim()}
                if ($_ -like "*Dest*")   {$Destination = (($_.Split(':'))[1]).trim()}
            }

            $Footer | ForEach-Object {
                if ($_ -like "*Dirs*"){
                    $lineAsArray = (($_.Split(':')[1]).trim()) -split '\s+'
                    $DirsFAILED = $lineAsArray[4]
                    
                }
                if ($_ -like "*Files*"){
                    $lineAsArray = ($_.Split(':')[1]).trim() -split '\s+'
                    $FilesFAILED = $lineAsArray[4]     
                    
                }          
    }
    return $FilesFailed
    }

    jeudi 26 mai 2016 13:31