Question Integration Progress barre

Plus d'informations
il y a 10 ans 10 mois #20369 par David
Integration Progress barre a été créé par David
Alors je reviens à vous pour ce problème d’intégration de progress bar, j'ai avance un peu mais je reste bloqué :

J'ai trouvé un script de fonction qui m'a l'air de parfaitement correspondre à mes attentes keithga.wordpress.com/2014/06/23/copy-itemwithprogress/

J'ai récupéré le script :

[code:1]<#
.SYNOPSIS
RoboCopy with PowerShell progress.

.DESCRIPTION
Performs file copy with RoboCopy. Output from RoboCopy is captured,
parsed, and returned as Powershell native status and progress.

.PARAMETER RobocopyArgs
List of arguments passed directly to Robocopy.
Must not conflict with defaults: /ndl /TEE /Bytes /NC /nfl /Log

.OUTPUTS
Returns an object with the status of final copy.
REMINDER: Any error level below 8 can be considered a success by RoboCopy.

.EXAMPLE
C:\PS> .\Copy-ItemWithProgress c:\Src d:\Dest

Copy the contents of the c:\Src directory to a directory d:\Dest
Without the /e or /mir switch, only files from the root of c:\src are copied.

.EXAMPLE
C:\PS> .\Copy-ItemWithProgress '\"c:\Src Files\"' d:\Dest /mir /xf *.log -Verbose

Copy the contents of the 'c:\Name with Space' directory to a directory d:\Dest
/mir and /XF parameters are passed to robocopy, and script is run verbose

.LINK
keithga.wordpress.com/2014/06/23/copy-itemwithprogress

.NOTES
By Keith S. Garner (Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.) - 6/23/2014
With inspiration by Trevor Sullivan @pcgeek86

#>

[CmdletBinding()]
param(
[Parameter(Mandatory = $true,ValueFromRemainingArguments=$true)]
[string[]] $RobocopyArgs
)

$ScanLog = [IO.Path]::GetTempFileName()
$RoboLog = [IO.Path]::GetTempFileName()
$ScanArgs = $RobocopyArgs + \"/ndl /TEE /bytes /Log:$ScanLog /nfl /L\".Split(\" \"«»)
$RoboArgs = $RobocopyArgs + \"/ndl /TEE /bytes /Log:$RoboLog /NC\".Split(\" \"«»)

# Launch Robocopy Processes
write-verbose (\"Robocopy Scan:`n\" + ($ScanArgs -join \" \"«»))
write-verbose (\"Robocopy Full:`n\" + ($RoboArgs -join \" \"«»))
$ScanRun = start-process robocopy -PassThru -WindowStyle Hidden -ArgumentList $ScanArgs
$RoboRun = start-process robocopy -PassThru -WindowStyle Hidden -ArgumentList $RoboArgs

# Parse Robocopy \"Scan\" pass
$ScanRun.WaitForExit()
$LogData = get-content $ScanLog
if ($ScanRun.ExitCode -ge 8)
{
$LogData|out-string|Write-Error
throw \"Robocopy $($ScanRun.ExitCode)\"
}
$FileSize = [regex]::Match($LogData[-4],\".+:\s+(\d+)\s+(\d+)\"«»).Groups[2].Value
write-verbose (\"Robocopy Bytes: $FileSize `n\" +($LogData -join \"`n\"«»))

# Monitor Full RoboCopy
while (!$RoboRun.HasExited)
{
$LogData = get-content $RoboLog
$Files = $LogData -match \"^\s*(\d+)\s+(\S+)\"
if ($Files -ne $Null )
{
$copied = ($Files[0..($Files.Length-2)] | %{$_.Split(\"`t\"«»)[-2]} | Measure -sum).Sum
if ($LogData[-1] -match \"(100|\d?\d\.\d)\%\"«»)
{
write-progress Copy -ParentID $RoboRun.ID -percentComplete $LogData[-1].Trim(\"% `t\"«») $LogData[-1]
$Copied += $Files[-1].Split(\"`t\"«»)[-2] /100 * ($LogData[-1].Trim(\"% `t\"«»))
}
else
{
write-progress Copy -ParentID $RoboRun.ID -Complete
}
write-progress ROBOCOPY -ID $RoboRun.ID -PercentComplete ($Copied/$FileSize*100) $Files[-1].Split(\"`t\"«»)[-1]
}
}

# Parse full RoboCopy pass results, and cleanup
(get-content $RoboLog)[-11..-2] | out-string | Write-Verbose
[PSCustomObject]@{ ExitCode = $RoboRun.ExitCode }
remove-item $RoboLog, $ScanLog[/code:1]

Je voudrais m'en servir pour faire ma copie (1 dossier contenant plusieurs sous-dossiers contenant tous des fichiers

J'ai donc créé un second .ps1 qui fait appel au précédent script dont voici le code :

[code:1]C:\Users\David\Desktop\Copy-ItemWithProgress.ps1 \"E:\source\" \"C:\destination\\" -verbose[/code:1]

Mais à l'execution j'ai ces messages d'erreur :

Fichier attaché :

J'ai eu beau chercher toute la journée, je ne vois pas à quoi cela peut être du :(

Pouvez vous me dire si ma façon de faire est la bonne svp sachant que je decouvre le scripting ;)

Et surtout comment corriger ces erreurs

Je vous remercie par avance

David

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

Plus d'informations
il y a 10 ans 10 mois #20371 par xyz
Réponse de xyz sur le sujet Re:Integration Progress barre
Salut,
goro écrit:

je ne vois pas à quoi cela peut être du

L'analyse du log semble erroné, à moins que le fichier de log soit vide.
La version de RoboCopy ?
goro écrit:

Pouvez vous me dire si ma façon de faire est la bonne svp sachant que je decouvre le scripting ;)
goro écrit:

Pas de soucis.
goro écrit:

Et surtout comment corriger ces erreurs

Sans le fichier de log, pas facile à dire.
le script n'ayant pas de gestion d'erreur c'est à l'utilsateur de débugger.

Insére des appels à write-debug pour tracer ce qui se passe ou utilise le debugger intégré de ISE

Tutoriels PowerShell

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

Plus d'informations
il y a 10 ans 10 mois #20372 par David
Réponse de David sur le sujet Re:Integration Progress barre
Salut et merci pour ta réponse !

Alors en effet, le fichier de log est vide ....

Je sais pas pk et ce que ça veut dire ...

Pour : write-debug je ne sais pas ou le mettre ni même si j'ai juste à copier cette ligne exacte simplement ou ajouter autre chose, j’espère que tu pourras me renseigner

Bonne nuit a demain et merci d'avance

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

Plus d'informations
il y a 10 ans 10 mois #20374 par xyz
Réponse de xyz sur le sujet Re:Integration Progress barre
goro écrit:

Je sais pas pk et ce que ça veut dire ...

Moi non plus :P
En pêchant sur le net, on n'est pas assuré de tjr attraper qq chose de comestible...
Il faut extraire la ligne de commande exécutée et la vérifier.
goro écrit:

Pour : write-debug je ne sais pas ou le mettre ni même si j'ai juste à copier cette ligne exacte simplement ou ajouter autre chose,

Dans le script :
[code:1]
...
$ScanRun.WaitForExit()
Write-Debug \" ScanLog vide ? $( (Dir $Scanlog).Length -eq 0)\" #Si l'assertion est fausse, pas la peine d'aller plus loin...
$LogData = get-content $ScanLog
...
[/code:1]
Pour activer l'affichage:
[code:1]
$DebugPreference ='Continue'
#Run script

#désactiver
$DebugPreference ='SilentlyContinue'
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 10 ans 10 mois #20455 par David
Réponse de David sur le sujet Re:Integration Progress barre
Salut Laurent,

Alors tout d'abord merci pour ta réponse, mais n'arrivant à rien dû a mon incompétence dans le domaine, je me suis replié sur un autre script de copie que j'ai trouvé sur ce même forum.

[code:1]Function Copy-ItemWithProgressBar{
[cmdletBinding()]
Param (
[parameter(Mandatory=$true, ValueFromPipeline=$true)]
$Source,
[parameter(Mandatory=$true, ValueFromPipeline=$false)]
$Destination,
[parameter(Mandatory=$true, ValueFromPipeline=$true)]
$Compteur_Item_Copie
)

begin
{
$numberofitems = @(Get-ChildItem $Source).Count
$cpt = 0
$Source = Get-Item -Path $Source
}

process
{
if ($Source.PSIsContainer)
{
foreach ($item in (Get-ChildItem $Source))
{
if (!(Test-Path $Destination))
{
New-Item -Path $Destination -ItemType Directory | Out-Null
}
if ($item.PSIsContainer) # c'est un dossier
{
Copy-ItemWithProgressBar -Source $item.FullName -Destination (Join-Path $Destination $item.Name) $Compteur_Item_Copie
}
else # c'est un fichier
{
$cpt++
Copy-Item -Path $item.Fullname -Destination $Destination
$Totalisateur = \"COPIE ITEM \" + $Compteur_Item_Copie + \" de \" + $totalfichiers

Write-Progress -Id 1 -CurrentOperation $Totalisateur -Activity (\"DOSSIER : {0}\" -f $Source) -PercentComplete ($cpt / $numberofitems * 100) -Status (\"FICHIER : {0} - {1} sur {2}\" -f $item.Name, $cpt, $numberofitems)
}
} #end foreach
}
} #end process


}

cls
$nbfiles = Get-ChildItem \"$Source\" -Force -Recurse
$totalfichiers = $nbfiles.count

# Import Assemblies
[void][reflection.assembly]::Load(\"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"«»)


#region | Global Variables
$date = Get-Date -Format dd.MM.yy
$backupFolder = \"Backup du \" + \"$date\"

#endregion

$UsbDisk = gwmi win32_diskdrive | ?{$_.interfacetype -eq \"USB\"} | %{gwmi -Query \"ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`\"$($_.DeviceID.replace('\','\\'))`\"} WHERE AssocClass = Win32_DiskDriveToDiskPartition\"} | %{gwmi -Query \"ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`\"$($_.DeviceID)`\"} WHERE AssocClass = Win32_LogicalDiskToPartition\"} | %{$_.deviceid}

# if we not find the USB Drive, Throw error

if ( $UsbDisk -eq $null ) { #IF_1

[void][System.Windows.Forms.MessageBox]::«»Show(\"Pas de support USB trouvé, Merci d'en insérer un !\",\"Support USB Absent\"«»)

} #IF_1



else {

$testfolder = Test-Path \"$UsbDisk\$backupFolder\"

if ($testfolder -eq $true) {

[void][System.Windows.Forms.MessageBox]::«»Show(\"Un dossier $UsbDisk\$backupFolder existe déjà, Merci de le renommer ou le supprimer avant de continuer.\",\"Le dossier existe déjà\"«»)

}


else {

mkdir \"$UsbDisk\$backupFolder\"

# Start Copying Data

Get-Process | Where { $_.Name -Eq \"Firefox\" } | Kill

copy-itemWithProgressBar -Source \"$ENV:USERPROFILE\Desktop\" -Destination \"$UsbDisk\$backupFolder\SAUVDIR-GERANT\Desktop\" /mir
copy-itemWithProgressBar -Source \"$ENV:USERPROFILE\Documents\" -Destination \"$UsbDisk\$backupFolder\SAUVDIR-GERANT\Documents\" /mir
copy-itemWithProgressBar -Source \"$ENV:«»SystemDrive\Program Files (x86)\VIAGRA-CIALIS\" -Destination \"$UsbDisk\$backupFolder\SAUVDIR-OLDAPI\VIAGRA-CIALIS\" /mir
copy-itemWithProgressBar -Source \"$ENV:«»SystemDrive\VIAGRA\" -Destination \"$UsbDisk\$backupFolder\SAUVDIR-OLDAPI\VIAGRA\" /mir
copy-itemWithProgressBar -Source \"$ENV:«»SystemDrive\CIALIS\" -Destination \"$UsbDisk\$backupFolder\SAUVDIR-OLDAPI\CIALIS\" /mir
copy-itemWithProgressBar -Source \"$ENV:APPDATA\Mozilla\Firefox\Profiles\" -Destination \"$UsbDisk\$backupFolder\SAUVDIR-GERANT\Profiles\" /mir

Reg export HKLM\Software\DCIALIS\ $UsbDisk\$backupFolder\SAUVDIR-OLDAPI\CleWinkey.txt
Reg export HKLM\Software\CIALIS\ $UsbDisk\$backupFolder\SAUVDIR-OLDAPI\ClePaie.txt

Write-Host -ForegroundColor 'Green' \"Backup Complet !\"

#Open backup folder

explorer \"$UsbDisk\$backupFolder\"


}

} #Else_1

#Penser à retirer le (x86) du chemin de VIAGRA-CIALIS
[/code:1]

Si vous avez des avis ou des conseils sur celui ci n’hésitez pas c un condensé de recherches sur google et d'adaptations alors j'ai peut être oublié des choses

Voici mon script quasiment finalisé

J'ai cependant une question:

J'ai, sur certaines machines que je dois sauvegarder avec ce script, des partitions D: (GERANT) et E: (Sauvegarde)

Comment pourrais je faire pour que si ces lecteurs sont détéctés, ils soient copiés en intégralité ? Sachant qu'on ne peut pas se servir des lettres de lecteur car mon HDD externe ( en l'absence de ces partitions aura la lettre D: )

Ca fait 3 jours que je cherche et je n'ai pas trouvé grand chose avec l'utilisation du nom au lieu de la lettre de lecteur

un truc du genre

if Sauvegarde exist le copier et si E existe forcement D existe donc on copie les 2

Enfin je ne sais pas si je suis très clair ..

Merci d'avance de votre temps et aide

David<br><br>Message édité par: goro, à: 12/07/15 13:21

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

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