none
[PowerShell] Script de résultat sauvegarde par mail RRS feed

  • Discussion générale


  • Bonjour,

    J'essaye de faire un script mais je m'y perds un peu.

    J'ai un dossier sur un de mes serveurs qui après chaque sauvegarde donne le résultat de plusieurs jobs dans une dizaine de fichiers qui peuvent être exploités en .txt.

    Dans un premier temps j'aimerais sélectionné seulement les fichiers à J-1:


    J'ai fait ce script mais il ne fonctionne pas:


    $Data="C:\request"
    Get-Childitem $Data -recurse | ?{($_.PSIsContainer -eq 0) -and ($_.CreationTime -lt (get-Date).adddays(-1))} | Move-Item -Path *.001 -Destination "C:\test\"


    Il ne me retourne pourtant pas d'erreur.

    Auriez vous une idée, merci.







    lundi 19 novembre 2012 14:12

Toutes les réponses

  • J'avance un peu mais ce n'est toujours pas ça...

    $fichiers=Get-Childitem c:\request\*.* | where { !($_.CreationTime -lt (get-Date).Adddays(-2))}

    Move-Item $fichiers -Destination "C:\test\"




    • Modifié Mr GILLES mardi 20 novembre 2012 10:31
    lundi 19 novembre 2012 16:04
  • Bonjour

    est ce que sur ce point

    >>Dans un premier temps j'aimerais déplacer tout les fichiers d'un répertoire qui sont antérieur à la date du jour

    le résultat est correct ?

    >>J'avance un peu mais ce n'est toujours pas ça...

    M'est avis que vous êtes le seul à comprendre ce que c'est que 'çà' ;-)

    En passant, la modification du texte de votre premier post était judicieuse.


    Beatus, qui prodest, quibus potest.

    mardi 20 novembre 2012 11:42
    Modérateur
  • Merci pour votre réponse.

    Voici mon code actuel:

    $rep="D:\spool\request\*.*"

    $fichier=Get-Childitem $rep | where {!($_.CreationTime -lt (get-date).Adddays(-1))}

    ("$fichier").Contains("successfully")

    #La première ligne: Variable "$rep" qui indique le chemin du répertoire ou sont situé mes fichiers.

    #La deuxième ligne: Variable "$fichier" qui exclus tout les fichiers crée il y a plus d'une journée

    La 1ere étape (les deux première lignes) est opérationnel.

    Maintenant je suis sur la deuxième étape, j'aimerais qu'il regarde dans chacun des fichiers de la variable "$fichier" si le mot "successfully" apparaît puis ensuite d'envoyé toutes les réponses dans un fichier "match.txt" dans le but de l'insérer ensuite dans un mail.

    En gros, j'aimerais que mon mail ressemble a ceci au final.

    nom du fichier => True/Ok

    nom du fichier => True/Ok

    nom du fichier => True/Ok

    nom du fichier => False/Erreur


    • Modifié Mr GILLES mardi 20 novembre 2012 13:25
    mardi 20 novembre 2012 13:22
  • >>Maintenant je suis sur la deuxième étape, j'aimerais qu'il regarde dans chacun des fichiers de la variable "$fichier" si le mot "successfully" apparaît

    La recherche du mot "successfully" se fait sur le nom du fichier ou dans son contenu ?


    Beatus, qui prodest, quibus potest.

    mardi 20 novembre 2012 13:30
    Modérateur
  • Dans son contenu:

    Voici deux exemple des fichiers:

                                                     Job Log                                      19/11/12   1:21:12         Page    1
    
      Job Name . . . . . . . . . . :   LIVPRD1512     User  . . . . :   QSECOFR        Number . . . :   050445
      Job Description  . . . . . . :   QDFTJOBD       Library . . . :   QGPL
    
    
    TIME   MSGID  SEV TYPE  MESSAGE TEXT                                                                 FROM PGM   INST TO PGM     INST
    
    220413            RQST -U4SAVLIB LIBRARY(LIVPRD1512) PATH('D:\SAUVEGARDES\LIVPRD1512.u4s')           *EXT            *EXT
    012112 UNI016F 10 COMP  1 libraries successfully saved.                                              QU4SAVLIBC      QCMD
    
    
    
    
    
    

    et un autre qui n'est pas ok:

                                                     Job Log                                      17/11/12   6:30:20         Page    1
    
      Job Name . . . . . . . . . . :   QSYSSCD        User  . . . . :   QSECOFR        Number . . . :   050385
      Job Description  . . . . . . :   QDFTJOBD       Library . . . :   QGPL
    
    
    TIME   MSGID  SEV TYPE  MESSAGE TEXT                                                                 FROM PGM   INST TO PGM     INST
    
    220326            RQST -CALL QSYS/QEZSCNEP                                                           *EXT            *EXT
    063020 CPC1219 50 DIAG  This job ended abnormally.                                                   QRCVDTAQ        *EXT
                            Cause . . . . . :   An error occurred that caused this job to end
                              abnormally.
                            Recovery  . . . :   See the previously listed messages in the job log for
                              this job. Correct the errors and try the request again.
    
    
    
    

    J'ai modifier ma commande en "$fichier -contains 'successfully'" mais toujours le même message donc je continue a chercher.
    Désolé si mon code peu paraître parfois incohérent mais c'est le premier script que je réalise en PS.

    mardi 20 novembre 2012 13:35
  • Effectivement je pense que ma commande recherche directement sur le nom du fichier et pas dans les fichiers eux mêmes.

    " Select-String -Path $fichier -Pattern "successfully"  "  avec cette commande le shell ne me retourne rien mais j'ai aucune erreur.

    • Modifié Mr GILLES mardi 20 novembre 2012 13:55
    mardi 20 novembre 2012 13:39
  • >>Désolé si mon code peu paraître parfois incohérent mais c'est le premier script que je réalise en PS.

    Pas de soucis

    Un début de solution :

    #Avec les deux exemples donnés
    Dir *.txt|Select-string 'successfully saved'
    #renvoi 
    # Success.txt:6:012112 UNI016F 10 COMP  1 libraries successfully saved.
    # QU4SAVLIBC      QCMD
    
    
    $res|select *
    #renvoi
    # IgnoreCase : True
    # LineNumber : 6
    # Line       : 012112 UNI016F 10 COMP  1 libraries successfully saved.
    #              QU4SAVLIBC      QCMD
    # Filename   : Success.txt
    # Path       : C:\temp\Success.txt
    # Pattern    : successfully saved
    # Context    :
    # Matches    : {successfully saved}


    Beatus, qui prodest, quibus potest.

    mardi 20 novembre 2012 14:15
    Modérateur
  • Merci de votre aide,

    Mon problème et que je ne peux pas travailler sur un seul fichier. Car avec ma variable:

    $rep="D:\spool\request\*.*"
    $fichier=Get-Childitem $rep | where {!($_.CreationTime -lt (get-date).Adddays(-1))}

    J'obtient une liste de tout les fichiers crée le jour précèdent et c'est a partir de cette liste que je veux rechercher dans chaque fichier du jours précèdent  le mot successible ou non. L'autre problème et que les noms de fichiers sont de se type : 05405.0001 / 05004.0001 / 05557.0002 et c'est vraiment alléatoire c'est pour cela que je me réfère uniquement a leur date de création.

    Du coup j'ai essayé :

    $rep="D:\iris\serveur\spool\request\*.*"
    $fichier=Get-Childitem $rep | where {!($_.CreationTime -lt (get-date).Adddays(-1))}
    $fichier | dir *.* Select-String 'successfully'

    Mais la commande me retourne:

    Get-ChildItem : Impossible de trouver un paramètre positionnel acceptant l'argument « successfully ».
    Au niveau de C:\Users\administrateur.TAIGA\OK.ps1 : 3 Caractère : 15
    + $fichier | dir <<<<  *.* Select-String 'successfully'
        + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemComman
    Mais j'ai du forcement mal l'écrire. 


    • Modifié Mr GILLES mardi 20 novembre 2012 14:42
    mardi 20 novembre 2012 14:41
  • Essayez ceci :

    $rep="D:\iris\serveur\spool\request\*.*"
    $Resultat=Get-Childitem $rep | 
               where {!($_.CreationTime -lt (get-date).Adddays(-1))}|
               Select-String 'successfully'


    Beatus, qui prodest, quibus potest.

    mardi 20 novembre 2012 14:55
    Modérateur
  • Il faut que j'utilise Foreach car je rechercher a partir d'une collection, donc:

    $rep="D:\iris\serveur\spool\request\*.*"
    $fichier=Get-Childitem $rep | where {!($_.CreationTime -lt (get-date).Adddays(-1))}
    foreach ($file in $fichier) {
    Select-String $file "successfully"
    }

    Mais j'ai une erreur!

    mardi 20 novembre 2012 15:46
  • >>Mais j'ai une erreur!

    Et on peut savoir laquelle ou c'est confidentiel ;-)

    Essayez ceci :

    $rep="D:\iris\serveur\spool\request\*.*"
    $Resultat=Get-Childitem $rep | 
               where {!($_.CreationTime -lt (get-date).Adddays(-1))}|
               Select-String -Pattern 'successfully'
    En utilisant le pipeline le Foreach est implicite, chaque objet répondant à la clause Where est émit vers le segment de pipline suivant, ici le Select-String.

    Beatus, qui prodest, quibus potest.

    mardi 20 novembre 2012 17:23
    Modérateur
  • Votre commande ne me retourne aucun resultat.

    Exactement le foreach permet de sélectionner chaque fichier de mon répertoire et d’effectuer une action sur chacun de celui-ci.

    le code:

    $rep="D:\iris\serveur\spool\request\*.*"
    $fichier=Get-Childitem $rep | where {!($_.CreationTime -lt (get-date).Adddays(-1))}
    foreach ($file in $fichier) {
    select-string "successfully"
    }

    Me retourne ceci:

    Select-String : Le jeu de paramètres ne peut pas être résolu à l'aide des paramètres

    nommés spécifiés.Au niveau de C:\Users\administrateur\OK.ps1 : 4 Caractère :

    14+ select-string <<<<  "successfully"    + CategoryInfo          : InvalidArgument:

    (:) [Select-String], ParameterBindingException    + FullyQualifiedErrorId :

    AmbiguousParameterSet,Microsoft.PowerShell.Commands.SelectStringCommand



    • Modifié Mr GILLES mercredi 21 novembre 2012 08:13
    mercredi 21 novembre 2012 08:13
  • J'avais oublié de préciser le paramètre  -Pattern sur le cmdlet Select-String

    Essayez ceci :

    $rep="D:\iris\serveur\spool\request\*.*"
    $Resultat=Get-Childitem $rep | 
               where {!($_.CreationTime -lt (get-date).Adddays(-1))}|
               Select-String -Pattern 'successfully'
    

    >>Votre commande ne me retourne aucun resultat.

    ici ce sera le cas s'il n'existe aucun fichier répondant aux critères.


    Beatus, qui prodest, quibus potest.

    mercredi 21 novembre 2012 08:52
    Modérateur
  • Même avec le parametre Pattern cela ne change rien j'avais fait plusieurs essai.

    Je pense qu'il faut que j'utilise obligatoirement le Foreach pour que ma commande select-string se fasse sur chacun des fichiers de la collection et non sur la liste des noms juste en utilisant un pipe. Le problème étant qu'il me met un message d'erreur (voir plus haut)

    mercredi 21 novembre 2012 10:23
  • A titre d'exemple:

    $rep="D:\iris\serveur\spool\request\*.*"
    $Resultat=Get-Childitem $rep | where {!($_.CreationTime -lt (get-date).Adddays(-1))}
    foreach ($file in $Resultat) {
        Echo $file.name
      }


    Me retourne bien tous les noms de fichiers de la date du jour précèdant:

    018135.0001

    018179.0001

    018198.0001

    018199.0001

    018200.0001

    018201.0001

    018202.0001

    Ce que j'aimerais maintenant c'est rechercher dans chacun de ces fichiers le mot 'successfully' et qu'il me retourne True ou Ok en face de chaque nom de fichier et envoyé ce résultat dans un fichiers.txt. Si possible mettre une condition que quand il ne trouve pas le mot succesfully dans un fichier il met Erreur en face du nom de fichier dans la réponse. Suis-je compréhensible? 

    EDIT: Voici le résultat pour le moment 

    $fileContent=""
    $rep="D:\iris\serveur\spool\request\*.*"
    $fileList=Get-Childitem $rep | where {!($_.CreationTime -lt (get-date).Adddays(-1))}
    foreach ($file in $fileList) {
        $result=Select-String -Path $file -Pattern "successfully"
    	if ($result -eq $NULL)
    	{
    	$concat="`n" + $file.name + " => Erreur"
    	$fileContent = $fileContent + $concat
    	}
    	else
    	{
    	$concat="`n" + $file.name + " => Ok"
    	$fileContent = $fileContent + $concat
    	}
      }
      echo $fileContent

    • Modifié Mr GILLES mercredi 21 novembre 2012 15:45
    mercredi 21 novembre 2012 11:18
  • Bonjour, 

    je ne sais pas si j'ai compris ce que vous vouliez mais est ce qu'un truc dans le genre pourrait pas résoudre le probléme ?

    $rep="D:\iris\serveur\spool\request"
    $fileList=Get-ChildItem $rep 
    foreach ($file in $fileList)
    {
    $verif=(get-date).Adddays(-1)
    
        $createtimefile=$file.CreationTime
        $namefile =$file.Name
        if ($createtimefile -gt $verif)
        {
        echo " [ERREUR] $namefile crée le : $createtimefile"
        }
    
    }
    


    • Modifié Valentin M jeudi 13 décembre 2012 14:21
    jeudi 13 décembre 2012 14:21