Powershell condition if

chiwawa38 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   -  
blux Messages postés 2048 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je suis actuellement en train de développer un petit script de sauvegarde, et j'aimerai ajouter une condition lors d'une erreur :

xcopy C:\test\ejfi D:\Backup /E /H /R /Y /I /D | select-string -pattern "introuvable" | if ($true)
{

instruction
}

mon dossier "efji" existe pas, et j'aimerai que lorsque le power shell repond : fichier introuvable, je puisse effectuer ma condition.

J'espère avoir été clair et je vous remercie d'avance pour votre aide.

4 réponses

Résumé de la discussion

Un utilisateur développe un script de sauvegarde et souhaite déclencher une condition lorsque xcopy affiche le message 'fichier introuvable'. Parmi les réponses, il est conseillé d'utiliser Copy-Item avec -recurse -force et de tester l'état d'achèvement via $?, ou via une construction try/catch. D'autres suggèrent d'invoquer xcopy via Start-Process avec -ArgumentList, en rappelant que xcopy n'est pas une cmdlet PowerShell native. Certaines discussions soulignent aussi l'importance de vérifier les messages d'erreur après exécution et d'adapter les redirections ou les options selon le contexte, afin de traiter des chemins incluant des noms non standards ou des fichiers cachés.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. blux Messages postés 2048 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    pourquoi tu n'utilises pas la fonction 'copy-item' ?

    Copy-Item -Path $rep_src -Destination $rep_dst -recurse -force
    if ($?)
    {
        # Si ok
    }
    else
    {
        # Si pas ok
    }
    

    0
  2. chiwawa38 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    Je n'ai pas utilisé cette fonction car je ne la connaissais pas.
    Du coup les options sont-elles les même ? Je veux faire une sauvegarde incrémentale qui récupère tous les dossiers même vides, les fichiers cachés etc...

    En tout cas, ça semble plus complet que la commande "xcopy", plus destinée à des .bat.

    Je vais essayer merci !
    0
    1. blux Messages postés 2048 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Pas d'incrémental...
      Mais tu peux parfaitement faire un parcours de ton arborescence et boucler sur les fichiers à copier...
      Ou regarder du côté de start-process si tu veux conserver ta commande avec le /d
      Je jette un oeil pour voir comment on peut s'en sortir et je reviens dès que j'ai quelque chose.
      0
    2. chiwawa38 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
       
      c'est super sympa merci.
      En fait quand je faisais mon xcopy, je générais un fichier log :

      xcopy .... .... >> log.log

      Puis-je faire la même chose ici ? (Je vais rechercher de la documentation dessus mais si tu es au courant, ce serait super.)

      Mais pour résumé, ce script devra a terme, proposer une sauvegarde, générer un fichier log, si il y a une erreur, il doit envoyer un mail.
      Jusqu'à la j'ai pu y arriver, mais c'est la condition qui me pose problème.

      En tout cas, merci beaucoup pour l'aide que tu m'apportes.
      0
    3. kelux Messages postés 3065 Date d'inscription   Statut Contributeur Dernière intervention   434
       
      Salut,

      Xcopy doit avoir des retours d'erreur qui lui sont propres... (derniere section dans le lien, ex avec robocopy ; mais ça ne t'empeche pas de tout lire ;) )

      https://docs.microsoft.com/en-us/archive/blogs/

      Tu peux donc utiliser la méthode try-catch ; avec plusieurs blocs catch en fonction des erreurs que tu veux "attraper".

      Regarde la section ExitCode :
      https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb491035(v=technet.10)?redirectedfrom=MSDN
      0
    4. kelux Messages postés 3065 Date d'inscription   Statut Contributeur Dernière intervention   434
       
      Et effectivement Xcopy n'est pas du powershell ;)
      0
    5. blux Messages postés 2048 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Je viens de regarder, on peut lancer xcopy avec un start-process, mais le problème est que l'erreur que l'on peut intercepter n'est valable que si le xcopy n'a pas pu être lancé.
      On peut cependant créer des fichiers log en sortie où l'on trouvera les erreurs le cas échéant...
      0
  3. chiwawa38 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci c'est ce que j'ai fais.

    J'ai encore un problème, le dernier j'espère.
    Alors, j'ai fais un jeu d'essai, et le fait que le disque destinataire n'a pas l'espace suffisant, n'est pas reconnu comme problème.

    J'aimerai donc comparer les chaines de caractères du fichier Testsort2.txt (le fichier sortant) celui qui me prévient que l'espace n'est pas suffisant et si les chaines correspondent, alors j'execute l'instruction.

    J'ai trouvé quelque bout de code, qui ne fonctionne pas :
    $a = Get-Content "C:\test\Testsort2.txt"

    $a | foreach {
    if ($a -eq "disque insuffisant") {write-host = "ok"}

    else {write-host = "Nok"}
    }

    Si tu as une idée ?

    Bonne journée.
    0
    1. blux Messages postés 2048 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Quelle est l'erreur ?
      0
    2. chiwawa38 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
       
      j'ai le droit à un truc comme ça :

      nok
      nok
      ...
      Il me renvoi qu'a "else" alors que normalement il devrait trouvé ma condition, je pense que mon code n'est pas bon du tout . :/
      0
    3. kelux Messages postés 3065 Date d'inscription   Statut Contributeur Dernière intervention   434
       
      http://technet.microsoft.com/en-us/library/hh847759.aspx

      Utilise -contains pour voir ...
      0
    4. kelux Messages postés 3065 Date d'inscription   Statut Contributeur Dernière intervention   434
       
      Ou -like


      D'ailleurs la boucle for n'est pas nécessaire, tu pipes $a dans ton test.
      0
    5. chiwawa38 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
       
      toujours le même problème avec ou sans le for, et avec les autres opérateurs.
      Pas évident le powershell :/
      Merci pour votre aide les gars
      0
  4. chiwawa38 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour à tous, j'en profite pour dire qu'il y a eu du progrès, mais comme d'habitude, une solution est toujours accompagné d'un problême :

    $a = Get-Content $Logtest 
    
    Start-Process "c:\windows\system32\xcopy.exe" -argumentlist $xcopy  -RedirectStandardOutput $Logtest -RedirectStandardError $LogErreur -wait 
    
    
    if ($a -match "disque insuffisant")
     {
    
    Stop-Process -name xcopy
    Get-Content $Logtest >> $LogErreurTmp
    
     }


    Mon problême ici, c'est que la fenetre xcopy ne se ferme pas automatiquement lorsque ça marque "Espace disque insuffisant" du coup mon script ne peut pas continuer.
    Le problême reste le même si j'enlève le -wait.

    Voila, merci les solutions que vous pourrez m'apporter.
    0
    1. blux Messages postés 2048 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      je vais faire un test, en attendant tu mettras ton get-content APRES l'exécution de la commande...
      0