Auteur de questions
[PowerShell] Script de résultat sauvegarde par mail

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.
- Modifié Mr GILLES mardi 20 novembre 2012 13:24
- Type modifié Dan BajenaruMicrosoft employee mercredi 19 décembre 2012 10:16 attente de feedback
Toutes les réponses
-
-
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.
-
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
-
>>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.
-
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. -
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
-
>>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.
-
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
-
-
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!
-
>>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.
-
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
-
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.
-
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)
-
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
-
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