Bonjour,

Je suis en train de me battre pour gérer certaines erreurs et notamment celles qui concernent le fait qu'une commande n'est pas connue par une version x de powershell.

Typiquement,

> Cette erreur est correctement détectée par le script :

Pas connu en PS 2.0 et le scirpt sort bien en erreur
Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
$file_list = Get-ChildItem -Path $($src+'\'+$file) -File

Equivalent OK en PS 2.0
Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
$file_list = Get-ChildItem -Path $($src+'\'+$file) | Where { !$_.PSIsContainer }

> En revanche, celle ci n'est pas correctement traitée par le script. Il ne sort pas en erreur et je comprends pas pourquoi.

Pas connu en PS 2.0 et le script ne sort pas en erreur
Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
    if ( $false -in $success_list ) 
    { # Vérifier s'il y a eu des erreurs propres au déroulement de la fonction 
        $count = 0 ; foreach ( $v in $false_list ) { $count ++ }
        Write-Host `n'> ERREUR : Erreur(s) de déplacement constatée(s) : ['$count']'
    }

Equivalent OK en PS 2.0
Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
    $false_list = ( $success_list | Where { $_ -eq $false } )
    if ( $false_list -ne $null )
    { # Vérifier s'il y a eu des erreurs propres au déroulement de la fonction 
        $count = 0 ; foreach ( $v in $false_list ) { $count ++ }
        Write-Host `n'> ERREUR : Erreur(s) de déplacement constatée(s) : ['$count']'
    }

> Remarque

j'écris :
Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
$count = 0 ; foreach ( $v in $false_list ) { $count ++ }

au lieu de :

Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
$count = $false_list.Count

Car j'ai remarqué qu'en PS 2.0, si la liste est positive avec 0 ou 1 élément, la méthode .Count renvoi $null. "Cela fonctionne" que s'il y a 2 éléments ou plus dans le tableau. Je n'ai pas trouvé de réponse à cela mais je contourne de la sorte.
Néanmoins pour la variable $Error, la méthode .Count a un comportement normal s'il y a 0 ou 1 erreur en PS 2.0. Je ne sais trop quoi en penser vis à vis de ma dernière remarque.

> Pour information le script retourne la variable $CR pour statuer ou non le bon déroulement de celui-ci. Si $CR = 0, exécution du script OK et si $CR > 0, exécution du script NOK.

> Voici le code complet. Concrètement, je cherche à expliquer pourquoi l'erreur 1 est traitée ( $CR > 1 ) et pas l'erreur 2 ( $CR = 0 ).

En vous remerciant par avance pour votre aide.

Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
### VARIABLES ###
 
$src  = $args[0]
$dst  = $args[1]
$file = $args[2]
 
##### Fonctions #####
 
Function Ctrl-Path ( $path, $commentary )
{
    $success = $false
	if ((Test-Path -Path $path) -eq $True)
	{
		Write-Host `n'> Le Répertoire '$commentary' '$path' existe'
        $success = $true
	} 
    else 
    {
		Write-Host `n'> Le Répertoire '$commentary' '$path' n''existe pas'
 
	}
    return $success
}
 
 
Function Get-FileList ( $file )
{
    $file_list = $null
    if ( ( $file -eq '*' ) -or ( $file -match '`*.' ) )
	{
        Write-Host `n'> Chemin canonique : '$($src+'\'+$file)
		$file_list = Get-ChildItem -Path $($src+'\'+$file) | Where { !$_.PSIsContainer }
	}
	else { $file_list += $file }
    return $file_list
}
 
Function Move-ItemArchive( $src, $dst )
{
    $success = $true
    if ( ( $a = Test-Path -Path $($f.FullName) ) -and !( $b = Test-Path $($dst+'\'+$f.Name) ) )
	{
		Move-item $($f.FullName) -Destination $dst
 
        if ( !( $a = Test-Path -Path $($f.FullName) ) -and ( $b = Test-Path $($dst+'\'+$f.Name) ) )
        { # Le fichier déplacé est présent dans le repertoire de destination et n'est plus présent dans le répertoire source
            Write-Host OK
        } 
        else  
		{ # Erreur lors du déplacement du fichier : Le fichier déplacé n'est pas présent dans le repertoire de destination
			$success = $false
			if (  $a ) 
			{
				Write-Host NOK
				Write-Host '      - Erreur : Le fichier est toujours présent dans le répertoire source'
			}
			if ( !$b )
			{
				Write-Host NOK
				Write-Host '      - Erreur : Le fichier n''estpas présent dans le répertoire destination'
			}
		}
	}
	else
	{
		$success = $false
		if ( !$a ) 
		{
			Write-Host NOK
			Write-Host '      - Erreur : Le fichier source n''existe pas dans le repertoire source'
		}
		if (  $b )
		{
			Write-Host NOK
			Write-Host '      - Erreur : Le fichier source existe déjà dans le répertoire destination'
		}
	}
    return $success
}
 
Function archive
{
    Write-Host `n'> Début de l''archivage'
    $success = $false   ; # Variable qui détermine le bon déroulement ou non de la fonction
    $success_list = @() ; # Variable qui détermine s'il y a eu une ou plusieurs erreur durant les déplacements de fichers
	$file_list    = @() ; # Initialisation de la variable qui va contenir la liste des fichiers présents dans le répertoire source
    $file_count   = 0   ; # Variable qui compte le nombre de fichiers présents dans le répertoire source
 
    if ( ( Ctrl-Path -path $src -commentary "source" ) -and ( Ctrl-Path -path $dst -commentary "destination" ) )
    {
        $file_list = Get-FileList -file $file
 
	    if ( $file_list -ne $null )
	    { # On vérifie qu'il y a des fichiers à déplacer 
		    foreach ( $f in $file_list ) { $file_count++ }
            Write-Host `n'> ['$file_count'] fichier(s) présent(s) en argument'
 
            $index = 0 ; 
		    foreach ( $f in $file_list )
		    { # Début de la boucle de déplacement du ou des fichiers
			    Write-Host '   > Début de l''archivage du fichier '($index+1)/$file_count' :'
			    Write-Host '    + Src : ' $($f.FullName)
			    Write-Host '    + Dst : ' $dst
			    Write-Host '    + Status : ' -NoNeWLine 
 
                $success_list += Move-ItemArchive -src $f -dst $dst
                $index        += 1
		    }
	    }
	    else 
        { # S'il n'y a pas de fichier à déplacer ( pas considéré comme une erreur )
            if ( $Error.Count -eq 0 ) 
            { # On vérifie qu'il n'y a pas eu d'erreur dans logs d'erreurs std pour s'assurer que la cause n'est pas inhérente à une ou plusieurs erreurs powershell préalables mais bien au fait qu'il n'y ait aucun fichier correspondant aux critères
                Write-Host `n'> ATTENTION : Aucun fichier répondant au(x) critère(s)"' $file '" n''est présent dans le répertoire source' 
            }
            # Sinon on continue l'execution du script jusqu'au controle de la log d'erreur std
        }
    }
    else { $success_list += $false } 
 
    $false_list = ( $success_list | Where { $_ -eq $false } )
    if ( $false -in $success_list ) #$false_list -ne $null
    { # Vérifier s'il y a eu des erreurs propres au déroulement de la fonction 
        $count = 0 ; foreach ( $v in $false_list ) { $count ++ }
        Write-Host `n'> ERREUR : Erreur(s) de déplacement constatées : ['$count']'
    }
    else 
    {
        Write-Host `n'> Aucune erreur de déplacement n''a été constatée'
        $success = $true 
    }
    Write-Host `n'> Fin de l''archivage'
    return $success 
}
 
Function Main-Function
{
    $r = @(1,1)
 
    if ( ($success = archive) ) { $r[0] = 0 }
 
    if ( $Error.Count -ne 0 )
    { # Liste des erreurs inhérentes à powershell
        Write-Host `n'> ERREUR : Liste des erreurs survenues lors de l''éxecution de la fonction : ( Voir la log d''erreur pour plus de détails )'
        foreach ( $err in $Error ) { Write-Host '+ '$err }
    }
    else { $r[1] = 0 }
 
    return $( $r[0] + $r[1] )
}
 
##### Main #####
$CR = 1
$Error.Clear | Out-Null
$CR = Main-Function
Exit $CR
 
###FIN###