Question verifie une copie

Plus d'informations
il y a 15 ans 2 mois #9071 par pa94
verifie une copie a été créé par pa94
Bonjour,

Je suis novice sur powershell et voila ce que j'ai fait:

créer un simple script qui copie tel dossier,ficher vers tel dossier et qui vérifie qu'ils sont bien copiés.
voila mon script:

[code:1]$a=\"d:\documents\S605673\Mes Documents\Musique\"
$b=\"D:\sauvegarde\"
$c=\"D:\sauvegarde\Musique\"

cd $a

$nb1= get-childitem -recurse | measure-object | select count

#echo \" affiche nombre de fichiers et dossiers dans le répertoire actif\"
#echo $nb1

#Test-Path $c #Détermine si tous les éléments d'un chemin d'accès existent

if (!(Test-Path $c)) #test d'existence du dossier (execute la copie si faux)
{
echo \"debut copie de fichier\"
copy-item $a -destination $b -recurse
echo \"fin copie de fichier\"
}
else #sinon le dossier existe
{

echo ”le dossier existe”
}

cd $c

$nb2= get-childitem -recurse | measure-object | select count

Get-Variable nb1 , nb2
$nb1
$nb2

$nb1 -eq $nb2


if ( $nb1 -eq $nb2 ) #si $nb1 = $nb2
{
echo \"source bien copié dans destination\"
}
else
{
echo \"copie erreur dans le nombre\"
}
[/code:1]

Mais voila arrivé a la commande \"$nb1 -eq $nb2\" ,il me retourne la valeur false alors que les 2 variables sont identiques quand je les affiche donc il m'affiche copie erreur dans le nombre alors que mes fichiers sont bien copiés.
voici ce que ca m'affiche à l'ecran :
Fichier attaché :


Uploaded with ImageShack.us


si quelqu'un peut m'aider
Merci d'avance<br><br>Message édité par: pa94, à: 4/03/11 11:46
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #9073 par Richard Lazaro
Réponse de Richard Lazaro sur le sujet Re:verifie une copie
Bonjour,

Je pense avoir trouvé ton problème, quand tu fais cette commande pour récupérer le nombre d'élément :

[code:1]get-childitem -recurse | measure-object | select count[/code:1]

L'objet récupéré est un objet de type [System.Object.PSCustomObject] avec un attribut Count et non un [System.ValueType.Int32] or l'opérateur de comparaison ne comprend pas quand tu lui passes des valeur de type [System.Object.PSCustomObject].

Tu as donc deux solutions

Soit tu remplaces :
[code:1]get-childitem -recurse | measure-object | select count[/code:1]

par :
[code:1](get-childitem -recurse | measure-object).Count[/code:1]

Dans ce cas tu auras des valeurs de type Int32 dans tes variables.

Soit tu effectues ta comparaison sur l'attribut Count de ton PSCustomObject et donc tu remplaces :
[code:1]
if ( $nb1 -eq $nb2 ) #si $nb1 = $nb2
{
echo \&quot;source bien copié dans destination\&quot;
}
else
{
echo \&quot;copie erreur dans le nombre\&quot;
}
[/code:1]

par :
[code:1]
if ( $nb1.Count -eq $nb2.Count )
{
echo \&quot;source bien copié dans destination\&quot;
}
else
{
echo \&quot;copie erreur dans le nombre\&quot;
}
[/code:1]

J'espère que tu as compris mes explications.

Bien Cordialement,
Richard Lazaro.

Think-MS : (Get-Life).Days | %{ Learn-More }

\\&quot;Problems cannot be solved by the same level of thinking that created them.\\&quot; - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #9074 par pa94
Réponse de pa94 sur le sujet Re:verifie une copie
Super ! c'était ca mon problème ! je ne savais pas comment juste récupérer la valeur numérique de ma variable .

un grand merci pour ton aide Richard Lazaro .

Bon Weekend !!!

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #9078 par xyz
Réponse de xyz sur le sujet Re:verifie une copie
Salut,
je me permet une remarque :
Richard Lazaro écrit:

or l'opérateur de comparaison ne comprend pas quand tu lui passes des valeurs de type [System.Object.PSCustomObject].

L'opérateur de comparaison comprend très bien les opérandes $Nb1 et $Nb2,le pb est qu'ici on vérifie l'adresse des objets, dans ce cas des variables PowerShell qui sont donc de type référence, et pas le contenu du champ Count qui est ici de type valeur .
[code:1]
#On crée une variable de type PSCustomObject, cf. Select-Object
$nb1= get-childitem -recurse | measure-object | select count

#On manipule des variables contenant des références, c'est à dire des adresses mémoires
$v1=[ref]$nb1
$v2=[ref]$nb1

#On teste deux variables leur adresse est donc distincte
#Peut importe leur contenu, le test sera tjr faux
$v1 -eq $v2
#False

#On teste $null, car $Vx.Count n'existe pas
$v1.count -eq $v2.Count
#True
$v1.count -eq $null
#True

#On teste deux adresses pointant sur le même objet
#Une référence, [Ref], contient un champ value
$v1.value -eq $v2.value
#True

#On teste deux valeurs pointant sur le même objet
$v1.value.Count -eq $v2.value.Count
#True

#On affiche deux objets
$v1.value;$v2.value
# Count
#
# 41
# 41
#On affiche deux fois la propriété d'un object
$v1.value.Count;$v2.value.Count
#41
#41

#On modifie l'objet initial
$nb1.Count=-256
#...
$v1.value;$v2.value
# Count
#
# -256
# -256
$v1.value.Count;$v2.value.Count
#-256
#-256

#On test deux variables de type valeur
$I1=10
$I2=10
$I1 -eq $I2
#True
#On vérifie si le type est une type valeur ou un type référence
$Nb1.GetType().IsValueType
#False, car de type référence
$I1.GetType().IsValueType
#True, car de type valeur
[/code:1]
Ta formulation est exacte si, à mon avis, on fait l'impasse sur ce principe de base de dotnet.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.042 secondes
Propulsé par Kunena