[R] RunWait(@ComSpec ...) et les guillements

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

[R] RunWait(@ComSpec ...) et les guillements

#1

Message 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
Modifié en dernier par Laddy le lun. 20 déc. 2010 16:39, modifié 1 fois.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#2

Message 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)
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#3

Message 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
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#4

Message 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)
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#5

Message 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)
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#6

Message 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.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#7

Message 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 ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#8

Message 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
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#9

Message 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.
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#10

Message 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
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] RunWait(@ComSpec ...) et les guillements

#11

Message 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é.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [R] RunWait(@ComSpec ...) et les guillements

#12

Message 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)
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Répondre