Powershell condition if [Fermé]

Signaler
Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014
-
Messages postés
23761
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
-
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

Messages postés
23761
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
2 850
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
}

Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014

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 !
Messages postés
23761
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
2 850
Tu dois mettre xcopy (c'est une commande externe, elle n'est pas dans le 'noyau dos' de l'interpréteur cmd.exe) avec tes arguments dans -argumentlist.(enfin du moins, ça me parait logique)
C'est ce que tu as fait ?
Si c'est le cas et que ça ne marche pas, c'est que powershell est plus m....dique que je ne le pensais...
Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014

Desolé pour la réponse ultra tardive mais voila mon script, ce sera peut être plus facile pour toi de voir une eventuelle erreur :

cd \
echo "Date et heure de la sauvegarde" >> "C:\Sauvegarde_nas\Nas_Sauvegarde.log"
get-date >> "C:\Sauvegarde_nas\Nas_Sauvegarde.log"


New-Item -Path "C:\test\" -Name "Testsort2.txt" -ItemType File
Start-Process "c:\windows\system32\xcopy.exe" -RedirectStandardInput "C:\test\Testsort.txt" -RedirectStandardOutput "C:\test\Testsort1.txt" -RedirectStandardError "C:\test\Testsort2.txt" -wait
if ((Get-Item "C:\test\Testsort2.txt").length -gt 0)
{

$shell=new-object -com wscript.shell
$shell.popup("Nok")

}
else
{
$shell=new-object -com wscript.shell
$shell.popup("ok")

}


Get-Content "C:\test\Testsort2.txt" >> "C:\Sauvegarde_nas\Nas_Sauvegarde.log"
Remove-Item "C:\test\Testsort2.txt"

Voici mon Testsort.txt

xcopy C:\Users\test\Videos\blueray\test.txt C:\Users\test\Videos\blueray

ça vien soit de la, soit du xcopy
Messages postés
23761
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
2 850
Il faut ajouter -argumentlist."/d /i...." dans la ligne start-process.
Regarde mon exemple ici.

Par contre, cd / et echo ne sont pas des commandes powershell, ne confondrais-tu pas ?
Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014

J'avais pas vu ton -argumentlist, je pense que tu as du modifié le script et j'ai copié la mauvaise version de celle-ci.
Ensuite c'est exact ce ne sont pas de commandes powershell, mais il me semble quand même qu'elle fonctionne, même si c'est pas bien propre, je réglerai ça plus tard.

Il me reste quand même quelque questions (même si ça semble fonctionné), je n'ai pas compris à quoi sert :
-RedirectStandardInput, je pensais justement qu'il aurai le rôle de argumentlist
--argumentlist."/d /i...." <= qu'est ce que ça veut dire exactement (ça a fonctionné lorsque j'ai mis "C:\xcopy.txt (et les fichiers a copier)

Merci de tes réponses et de ta patience envers moi !
Messages postés
23761
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
2 850
J'ai modifié mon message la dernière fois à 15:21.

-redirectstandardinput sert à lire éventuellement la commande depuis un fichier, tu dois pouvoir l'ignorer

-argumentlist est une variable qui contient les paramètres envoyés au process

En temps normal, tu tapes xcopy suivi de paramètres : /h /d ...

En powershell, les paramètres sont à mettre dans la chaine ou variable qui suit argumentlist (noms des répertoires, options de copie... pour xcopy)
Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014

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.
Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014

ça semble foncitonner mais toujours ce probleme de redondance, voila ce que j'execute ce petit script :

PS C:\Users\joachimg> $a = Get-Content "C:\Sauvegarde_nas\Nas_Sauvegarde.log"

$a | foreach {
if ($a -match "disque insuffisant")

{write-host = "ok"}



else {write-host = "Nok"}
}
= ok
= ok
= ok
= ok
= ok
= ok
= ok
= ok
= ok
= ok
= ok
Messages postés
2999
Date d'inscription
vendredi 18 juin 2004
Statut
Contributeur
Dernière intervention
22 juin 2020
380
tu utilises du foreach ...

Et dans ton IF tu utilises la totalité de $a pour faire le match.

donc il va faire le"match" autant de fois qu'il y a de ligne dans $a.

Soit Sans ton foreach.

Soit si tu veux vraiment analyser ligne par ligne :

foreach ($b in $a) {
if ($b -match "disque insuffisant")

{write-host = "ok"}


else {write-host = "Nok"}
}
Messages postés
23761
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
2 850
Tu peux voir comme ceci :

$a = Get-Content "C:\toto\Testsort2.txt"
foreach ($line in $a)
{
  $shell=new-object -com wscript.shell
  $shell.popup($line)
 if ($line -match "disque insuffisant")
 {
  $shell=new-object -com wscript.shell
  $shell.popup("nok")
 }
    else
    {
  $shell=new-object -com wscript.shell
  $shell.popup("ok")
    }
} 

Par contre, tu auras autant de 'ok' que tu as de lignes qui ne contiennent pas 'disque insuffisant', à toi donc de savoir ce que tu cherches et sur quelle ligne.
Si c'est toujours sur la première, tu rajoutes un -totalcount 1 au get-content et tu vires le foreach.
Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014

Merci,
j'utilise foreach parce que ça ne marche pas lorsque je pipe simplement les deux commandes, à moins que je m'y prends mals :
$a = Get-Content "C:\Sauvegarde_nas\Nas_Sauvegarde.log"

$a | if ($a -match "disque insuffisant") 
     
     {write-host = "ok"}
     
     
     
     else {write-host = "Nok"}

j'ai donc ce message d'erreur :
Le terme « if » n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable.

Je vais essayer ta solution avec foreach.

desolé si j'ai vraiment du mal, en BTS SIO option SISR, on a des problèmes avec le dev, aussi facile soit-il.
Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014

et le fait que foreach lise ligne par ligne, il fait de même pour son analyse.

Par exemple :
$a : szaszasz ze
disque insuffisant
disque insuffisant
disque insuffisant
disque insuffisant
disque insuffisant
sdfg
dfgs
disque insuffisant
grd
disque insuffisant

Reponse du script :

= Nok
= ok
= ok
= ok
= ok
= ok
= Nok
= Nok
= ok
= Nok
= ok
Messages postés
49
Date d'inscription
lundi 1 juin 2009
Statut
Membre
Dernière intervention
7 novembre 2014

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.
Messages postés
23761
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
2 850
je vais faire un test, en attendant tu mettras ton get-content APRES l'exécution de la commande...