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
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
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)