Page 1 sur 1
[R] RunWait(@ComSpec ...) et les guillements
Posté : ven. 17 déc. 2010 12:19
par Laddy
Bonjour
j'ai beau tenté toutes les syntaxes possibles, j'ai des soucis avec la place des guillements simples et doubles dans la commande RunWait.
La commande ne se lance pas si j'utilise des variables.
Pourquoi ?
Fonctionne
Code : Tout sélectionner
RunWait(@ComSpec & ' /c "' &$SunVirtualBox&'VBoxManage.exe"' &" clonehd F:\xngdows.vdi G:\vlone.vdi", "", @SW_HIDE)
ne fonctionne pas
Code : Tout sélectionner
RunWait(@ComSpec & ' /c "' &$SunVirtualBox&'VBoxManage.exe"' &" clonehd " &$IniSource &" " & $IniDestination, "", @SW_HIDE)
Je souhaiterai ceci :
"C:\Program Files\Sun\Virtualbox\VboxManage.exe" clonevdi "F:\xp.vdi" "G:\clonage vdi\vloneXp.vdi"
Variables
Code : Tout sélectionner
Global $SunVirtualBox = RegRead("HKEY_LOCAL_MACHINE\Software\Sun\VirtualBox", "InstallDir") ; pris en compte
Global $OracleVirtualBox = RegRead("HKEY_LOCAL_MACHINE\Software\Oracle\VirtualBox", "InstallDir") ; pris en compte
$IniSource = IniRead(@ScriptDir &"\CloneVDIinfo.ini", "parametres", "Source", "NotFound")
$IniDestination = IniRead(@ScriptDir &"\CloneVDIinfo.ini", "parametres", "Destination", "NotFound")
Comment je peux y remédier ?
fichier ini
[parametres]
Source=F:\xp.vdi
Destination=G:\clonage vdi\vloneXp.vdi
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : ven. 17 déc. 2010 12:27
par matwachich
Voila la commande
Code : Tout sélectionner
Local $SunVirtualBox = RegRead("HKEY_LOCAL_MACHINE\Software\Sun\VirtualBox", "InstallDir") ; pris en compte
Global $OracleVirtualBox = RegRead("HKEY_LOCAL_MACHINE\Software\Oracle\VirtualBox", "InstallDir") ; pris en compte
$IniSource = IniRead(@ScriptDir &"\CloneVDIinfo.ini", "parametres", "Source", "NotFound")
$IniDestination = IniRead(@ScriptDir &"\CloneVDIinfo.ini", "parametres", "Destination", "NotFound")
$ligne_commande = @ComSpec & ' /c "' & $SunVirtualBox & '\VBoxManage.exe" clonehd "' & $IniSource & '" "' & $IniDestination & '"'
ConsoleWrite($ligne_commande & @CRLF)
RunWait($ligne_commande, "", @SW_HIDE)
Sinon, pourquoi utiliser @ComSpec?!
Alors que l'on peut tout simplement faire:
Code : Tout sélectionner
Local $SunVirtualBox = RegRead("HKEY_LOCAL_MACHINE\Software\Sun\VirtualBox", "InstallDir") ; pris en compte
Global $OracleVirtualBox = RegRead("HKEY_LOCAL_MACHINE\Software\Oracle\VirtualBox", "InstallDir") ; pris en compte
$IniSource = IniRead(@ScriptDir &"\CloneVDIinfo.ini", "parametres", "Source", "NotFound")
$IniDestination = IniRead(@ScriptDir &"\CloneVDIinfo.ini", "parametres", "Destination", "NotFound")
Run($SunVirtualBox & '\VBoxManage.exe clonehd "' & $IniSource & '" "' & $IniDestination & '"', $SunVirtualBox, @SW_HIDE)
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : ven. 17 déc. 2010 13:00
par Laddy
Bonjour matwachich
j'utilise @comSpec car vboxmanager est un outil en ligne de commande donc pour moi c'était obligatoire comme en batch.
je vais tester tes méthodes
du coup je peux faire la meme chose avec ??
Code : Tout sélectionner
RunWait(@ComSpec & ' /c "' &$SunVirtualBox&'VBoxManage.exe"' &" showhdinfo " &$IniSource &" > " &$ListInfo, "", @SW_HIDE)
Merci
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : ven. 17 déc. 2010 14:15
par Laddy
Appramment non il faut pas pour ce paramètre.
Question :
comment faire coïncider mon run et la barre de progression ?
$Progress1 = GUICtrlCreateProgress(16, 40, 265, 17)
J'ai mis ceci mais rien ne se passe ?
GUICtrlSetData($Progress1,100)
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : sam. 18 déc. 2010 20:42
par sylvanie
Bonsoir,
attention au fait que Runwait suspend le script, donc pas de progressbar possible sur l'avancement de l'exécution.
il faut passer par Run (qui renvoie un PID) puis il faut enchaîner avec un while portant sur le test de l'existence du process (processexist($pid)) qui pourra updater votre progressbar selon l'information de votre chois (je pense qu'il s'agit de la taille du clône de l'image d'après ce que je vois)
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : dim. 19 déc. 2010 17:55
par Laddy
Bonjour sylvanie
merci pour l'explication pour le moment c est assez abstrait pour moi
oui la progress bar se fait en fonction de la taille du fichier à cloner
donc si j ai bien compris je dois m orienter vers
$pid = Run(.......)
While ProcessExists($PID)
information progressbar
Wend
par contre je vois pas ce que je peux mettre au lieu je vais regarder la doc.
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : dim. 19 déc. 2010 23:15
par sylvanie
voici un exple d'illustaration :
ici c'est code fake qui construit un fichier par paquet de 16 octets sur 10 tours de boucles avec une pause d'une seconde par tour pour simuler une copie
► Afficher le texte
Code : Tout sélectionner
$file=@TempDir&"\totrash.txt"
FileDelete($file)
$i=0
While($i<10)
$hnd=FileOpen($file,1)
FileWrite($hnd,"aaaaaaaaaaaaaaaa")
FileClose($hnd)
Sleep(1000)
$i+=1
WEnd
compilez le de façon que l'exe se trouve au même endroit que le second script qui va plus vous interesser, qui traite la progressbarre :
► Afficher le texte
Code : Tout sélectionner
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 633, 447, 192, 124)
$Button1 = GUICtrlCreateButton("Fake copie", 160, 296, 329, 73, $WS_GROUP)
$Progress1 = GUICtrlCreateProgress(152, 168, 345, 41)
$Label1 = GUICtrlCreateLabel("Avancement", 160, 128, 64, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$tempfile=@TempDir&"\totrash.txt"
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
FileDelete($tempfile)
Exit
Case $Button1
$pid=Run(@ScriptDir&"\fake_copy.exe")
AdlibRegister("Update_progress",1000)
EndSwitch
WEnd
Func Update_progress()
$total=160 ; ici il faudra mettre la taille du fichier source qui se fera clôner
$pourcent=int (FileGetSize($tempfile)/$total * 100)
ConsoleWrite($pourcent&@CRLF)
GUICtrlSetData($Progress1,$pourcent)
If Not ProcessExists($pid) Then
GUICtrlSetData($Progress1,100)
AdlibUnRegister("Update_progress")
EndIf
EndFunc
Au passage vous remarquerez que j'ai détacher l'update dans un adlibregister. La raison est parce qu si bous faites un deuxième while à l'intérieure de votre while principal de fenêtre, alors cette dernière freezera si vous tentez de la manipuler. Mais le principe est le même.
Par contre si votre vrai process copie en gardant un lock sur le fichier en cours de création, alors malheureusement filegetsize échouera, mais restons pour le moment optimiste ^^
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : lun. 20 déc. 2010 15:15
par Laddy
Bonjour Sylvanie
j'ai regardé ton code est essayé de l'adapter au mien.
mais je pense que je n'ai pas bien compris
la console me dit ceci :
Code : Tout sélectionner
-9223372036854775807
-9223372036854775807
-9223372036854775807
et si je regarde mon Run j'ai le chemin C:\Program files\sun\virutlabox\vboxmanage.exe clonehd F:\xp.vdi G:\vxpclone.vdi -9223372036854775807
c'est quoi cette chose -9223372036854775807 ???
Exemple mon fichier source fait 6.55Go si il est cloné il fera la même taille.
la taille du fichier source ne peut elle pas être donné par $total = FileGetSize($IniSource) ?
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Global $SunVirtualBox = RegRead("HKEY_LOCAL_MACHINE\Software\Sun\VirtualBox", "InstallDir")
Global $IniSource = "F:\xp.vdi"
Global $IniDestination = "G:\Clone.vdi"
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 633, 447, 192, 124)
Global $Button1 = GUICtrlCreateButton("Fake copie", 160, 296, 329, 73, $WS_GROUP)
Global $Progress1 = GUICtrlCreateProgress(152, 168, 345, 41)
Global $Label1 = GUICtrlCreateLabel("Avancement", 160, 128, 64, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
;Global $tempfile=@TempDir&"\totrash.txt"
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
;FileDelete($tempfile)
Exit
Case $Button1
$pid= Run($SunVirtualBox & '\VBoxManage.exe clonehd "' & $IniSource & '" "' & $IniDestination & '"', $SunVirtualBox, @SW_HIDE)
;Run(@ScriptDir&"\fake_copy.exe")
AdlibRegister("Update_progress",1000)
EndSwitch
WEnd
Func Update_progress()
#cs
$total=160 ; ici il faudra mettre la taille du fichier source qui se fera clôner
$pourcent=int (FileGetSize($tempfile)/$total * 100)
#CE
$total = FileGetSize($IniSource) ; ici il faudra mettre la taille du fichier source qui se fera clôner
$pourcent=int (FileGetSize($IniDestination)/$total * 100)
ConsoleWrite($pourcent&@CRLF)
GUICtrlSetData($Progress1,$pourcent)
If Not ProcessExists($pid) Then
GUICtrlSetData($Progress1,100)
AdlibUnRegister("Update_progress")
EndIf
EndFunc
la message box me donne 7040180736
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : lun. 20 déc. 2010 16:06
par sylvanie
pour la taille totale, oui, l'appel semble bon
pour le -9223372036854775807 à la fin du Run, ??? essayez de fair un consolewrite de debug des variables une à une ...
Sinon faites également un consolewrite de @error juste après les filegetsize pour voir si la fonction échoue.
Une suggestion pour $total : calculez le une seule fois lors de l'appuie du bouton, avant le Run et non dans le adliberegister car du coups on évite de poller toute les secondes une info constante.
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : lun. 20 déc. 2010 16:31
par Laddy
sylvanie a écrit :pour la taille totale, oui, l'appel semble bon
pour le -9223372036854775807 à la fin du Run, ??? essayez de fair un consolewrite de debug des variables une à une ...
Les variables du run sont ok.
Si je met en commentaire ceci AdlibRegister("Update_progress",1000)
-9223372036854775807 disparait de la ligne Run.
Sinon faites également un consolewrite de @error juste après les filegetsize pour voir si la fonction échoue.
Une suggestion pour $total : calculez le une seule fois lors de l'appuie du bouton, avant le Run et non dans le adliberegister car du coups on évite de poller toute les secondes une info constante.
Je ne comprend pas
ConsoleWriteError(????) peut être ? -> ConsoleWriteError(Update_progress())
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Global $SunVirtualBox = RegRead("HKEY_LOCAL_MACHINE\Software\Sun\VirtualBox", "InstallDir")
Global $IniSource = "F:\xp.vdi"
Global $IniDestination = "G:\Clone.vdi"
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 633, 447, 192, 124)
Global $Button1 = GUICtrlCreateButton("Fake copie", 160, 296, 329, 73, $WS_GROUP)
Global $Progress1 = GUICtrlCreateProgress(152, 168, 345, 41)
Global $Label1 = GUICtrlCreateLabel("Avancement", 160, 128, 64, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
;Global $tempfile=@TempDir&"\totrash.txt"
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
;FileDelete($tempfile)
Exit
Case $Button1
$pid= Run($SunVirtualBox & '\VBoxManage.exe clonehd "' & $IniSource & '" "' & $IniDestination & '"', $SunVirtualBox, @SW_HIDE)
[color=#FF0000] $total = FileGetSize($IniSource) ; ici il faudra mettre la taille du fichier source qui se fera clôner
ConsoleWriteError(Update_progress())[/color]
AdlibRegister("Update_progress",1000)
EndSwitch
WEnd
Func Update_progress()
$pourcent=int (FileGetSize($IniDestination)/$total * 100)
ConsoleWrite($pourcent&@CRLF)
GUICtrlSetData($Progress1,$pourcent)
If Not ProcessExists($pid) Then
GUICtrlSetData($Progress1,100)
AdlibUnRegister("Update_progress")
EndIf
EndFunc
Dans le console j'ai ceci qui apparait :
-9223372036854775807
0-9223372036854775807
-9223372036854775807
Re: [..] RunWait(@ComSpec ...) et les guillements
Posté : lun. 20 déc. 2010 16:36
par Laddy
J'ai trouvé mon clone était non disponible d'ou les messages d'erreurs apparemment j'ai testé avec un autre fichier et c'est passé.
Re: [R] RunWait(@ComSpec ...) et les guillements
Posté : lun. 20 déc. 2010 17:02
par sylvanie
il y aurait donc un lock sur le fichier lors de sa création, c'est un peu ce que je craignais... (ou je n'ai pas compris la dernière remarque)
pour le consolewrite, je parlais bien de la macro "@error". Je pensait à :
Code : Tout sélectionner
$taille=FileGetSize($IniDestination)
consolewrite(@error&@CRLF)
$pourcent=int ($taille/$total * 100)
@error est le retours "code erreur" des fonctions Autoit (ou des votre, car cous avez alors la possibilité de l'assigner)