[R] Trouver lettre CD

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

[R] Trouver lettre CD

#1

Message par eln »

Bonjour

J'installe Office 2003 avec AutoIt et le CD d'install

Je suis confronté à demander le CD d'installation et à deviner la lettre du lecteur CD.

J'ai bien trouvé une solution mais je ne la trouve pas très "propre".

Ma solution actuelle :

Code : Tout sélectionner

While 1
If FileExists ("E:\setuppro.exe") Then ExitLoop
If FileExists ("F:\setuppro.exe") Then ExitLoop
If FileExists ("G:\setuppro.exe") Then ExitLoop
MsgBox (0, "Office 2003", "Veuillez insérer le CD d'Office 2003")
WEnd

If FileExists ("E:\setuppro.exe") Then $LetterCD = ("E:")
If FileExists ("F:\setuppro.exe") Then $LetterCD = ("F:")
If FileExists ("G:\setuppro.exe") Then $LetterCD = ("G:")

Run ($LetterCD & "\setuppro.exe")
Merci
Modifié en dernier par eln le dim. 09 sept. 2007 15:36, modifié 1 fois.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#2

Message par sylvanie »

DriveGetDrive ( "CDROM") te retournera un array contenant l'ensemble des lettre mappées sur des lecterus CD / DVD, du coups tu peux fignoler ta recherche
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

#3

Message par eln »

Merci sylvanie de ta réponse mais c'est quoi un "array" et en quoi cela consiste.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#4

Message par sylvanie »

array = tableau de dimension fixe, cf le script d'Ani en haut (avant)

et en bas (maintenant qu'Ani à redéplacer son message, il est joueur ^^)
Modifié en dernier par sylvanie le ven. 07 sept. 2007 19:43, modifié 1 fois.
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#5

Message par ani »

mot clé DriveGetDrive, DriveStatus

Code : Tout sélectionner

;On recherche tout drive cdrom 
$drvs = DriveGetDrive("CDROM") 
;Si il n'y a pas d'erreur alors 
If Not @error Then 
;Ici c'est le array dont parlé sylvanie 
For $i = 1 To $drvs[0] 
;On regarde le statut si actif 
If DriveStatus($drvs[$i] & "\") = "READY" Then 
;si le fichier 
If FileExists($drvs[$i] & "\setuppro.exe") Then 
Run ($drvs[$i] & "\setuppro.exe") 
endif 
else 
MsgBox (0, "Office 2003", "Veuillez insérer le CD d'Office 2003") 
endif 
Next 
endif
me semble qui y a un petit exemple sur l'ancien fofo avec cdrom ?
c'est peut etre pas correct je corrigerai ^^'


pour le array on peut dire que c'est un stoque de variable
en connaissant ou nom le contenu

on va prendre User qui sera la variable son contenu sera exemple:
1_user porte un nom
2_user est une fille
3_user habite
4_user a un domaine
5_user a une adresse

$user[5] = [1,2,3,4,5]

$user[5] est le array si on appelle le array il nous sortira les valeur
1,2,3,4,5

du moins je crois que sa fonctionne comme celà j'editerai si on répond :)
Modifié en dernier par ani le ven. 07 sept. 2007 19:26, modifié 1 fois.
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

#6

Message par eln »

ani a écrit :me semble qui y a un petit exemple sur l'ancien fofo avec cdrom ?
c'est peut etre pas correct je corrigerai ^^'
Tout à fait mais je n'avais pas compris. Avec les explications, cela parait un peu plus clair.
Si j'ai bien compris (corriger moi si je me trompe)

Code : Tout sélectionner

$drvs = DriveGetDrive("CDROM")
liste toutes les lettres de CD-Rom

Code : Tout sélectionner

For $i = 1 To $drvs[0]
les teste l'une après l'autre.

Ma lettre CD est donc définie par deux valeurs (abscisse et ordonnée)

Code : Tout sélectionner

If DriveStatus($drvs[$i] & "") = "READY" Then
;si le fichier
If FileExists($drvs[$i] & "\setuppro.exe") Then
Run ($drvs[$i] & "\setuppro.exe")
endif
else
MsgBox (0, "Office 2003", "Veuillez insérer le CD d'Office 2003")
endif
Next
endif
Actif ou Ready revient à savoir si il y a un CD dedans ?
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#7

Message par sylvanie »

effectivement, Ready implique la présence d'un média

par contre pour revenir au tableau contenant l'ensemble des lecteurs CD/ DVD n'a qu'une dimension, pas deux. L'indice 0 te renvoie le nombre total de lecteurs puis chacun se trouve en indice 1, 2 ...
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

#8

Message par eln »

Je crois que si même elle n'est pas jolie, je vais garder mon ancienne méthode car je suis confronté à d'autres problèmes :

- D'une part je souhaiterai installer Office plus tard (ce n'est pas un problème majeur, il suffit de le sortir de la boucle

- Même si le CD n'est pas inséré on sort de la boucle (a force d'appuyer sur [OK]) :

Code : Tout sélectionner

Array variable has incorrect number of subscripts or subscript dimension range exceeded.: 
Je ne sais pas si il y a une solution à cela. Sinon ce n'est pas grave, j'aurai appris des choses.

Encore Merci pour vos explications.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#9

Message par sylvanie »

là ce n'est pas normal, car tel est fait le script d'Ani, sauf si il y a eu réédition entre temps, si il y erreur lors de l'énumération, on ne rentre pas dans la boucle, et la boucle For s'arrête au nombre max de lecteur.
Peux tu poster le code que tu utilises en ce moment ?
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

#10

Message par eln »

sylvanie a écrit :là ce n'est pas normal, car tel est fait le script d'Ani, sauf si il y a eu réédition entre temps, si il y erreur lors de l'énumération, on ne rentre pas dans la boucle, et la boucle For s'arrête au nombre max de lecteur.
Peux tu poster le code que tu utilises en ce moment ?
Voila

Code : Tout sélectionner

;On recherche tout drive cdrom
$drvs = DriveGetDrive("CDROM")
;Si il n'y a pas d'erreur alors
If Not @error Then
;Ici c'est le array dont parlé sylvanie
For $i = 1 To $drvs[0]
;On regarde le statut si actif
If DriveStatus($drvs[$i] & "") = "READY" Then
;si le fichier
If FileExists($drvs[$i] & "\setuppro.exe") Then
ExitLoop
endif
else
MsgBox (0, "Office 2003", "Veuillez insérer le CD d'Office 2003")
endif
Next
endif 

Run ($drvs[$i] & "\setuppro.exe")
Si je cliques deux fois avec deux lecteurs deux CD-Rom (4 fois avec 4 lecteurs, etc...) sans insérer le CD, je sors de la boucle avec l'erreur

Et si j'ai 4 lecteurs CD et que je mets le CD sur le 4ème il faut que je cliques 4 fois sur OK, alors que j'ai inséré le CD (Chose peu probable).
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#11

Message par ani »

y a une erreur dans le code ;)

le principe etait de rechercher le fichier si il exister dans le lectuer sans pour cela connaitre a l'avance la lettre du drive ou de tous les enumerer,,, mais pour la seconde fois y a une erreur dans le code et toujours la meme :(

comme l'avait formulé sylvanie et voodoo faut passer par une boucle while

et d'introduire la valeur notready

Code : Tout sélectionner

$old_status="NOTREADY" ; ça c'est pour dire que l'ancien statu du cdrom était "vide" 

$drvs = DriveGetDrive("CDROM") 
for $indice = 1 to $drvs[0] 
$status= DriveStatus($drvs[$indice]) 
; si le lecteur a un cd et que juste avant il en avait pas 
if $status = "READY" And $old_status="NOTREADY" then $old_status="READY" ; <-- le cd est dans le lecteur donc faudra pas relancer tout ça au prochain passage, sinon tu vas lancer ton appli tant que le cd est dans le lecteur...If FileExists($drvs[$i] & "\setuppro.exe") Then 
Run ($drvs[$i] & "\setuppro.exe") 
endif 
Else 
consolewrite($drvs[$indice] & @CRLF) 
endif 
Next 
$old_status=$status ; le statu actuel devins l'ancien pour le prochain tours de boucle, si entre temps le cd a été éjecter, ça repasse donc à NOTREADY et le test d'avant est "réamorcé"sleep ( 10000 ) ; 10 sec entre deux check, car si t'arrives à éjecter, insérer un cd et refrmé le lecteru en 1 ms je te paie une bière, et surtout, je suis pas sur que ton lecteur apprécie d'être autant solicité ...
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

#12

Message par eln »

ani a écrit :y a une erreur dans le code ;)

le principe etait de rechercher le fichier si il exister dans le lectuer sans pour cela connaitre a l'avance la lettre du drive ou de tous les enumerer,,, mais pour la seconde fois y a une erreur dans le code et toujours la meme :(

comme l'avait formulé sylvanie et voodoo faut passer par une boucle while

et d'introduire la valeur notready
Merci mais apparemment il y a encore une erreur et je ne m'en sors pas. Sois trop neuneu ou alors l'heure est trop tardive.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#13

Message par ani »

faut m'excuser aussi suis pas très doué,,,, j'essaye d'aider mais sans succés :'(
vaudrait mieux pour moi,,,stopper :(
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

#14

Message par eln »

ani a écrit :vaudrait mieux pour moi,,,stopper :(
J'ai appris des choses. Ca peut servir. Je verrais ça demain. Merci.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#15

Message par sylvanie »

en reprenant vite fait ton script, voià l'erreur que j'ai constaté :

On recherche tout drive cdrom

Code : Tout sélectionner

 $drvs = DriveGetDrive ( " CDROM " ) 
;Si il n'y a pas d'erreur alors 
If Not @error Then 
;Ici c'est le array dont parlé sylvanie 
For $i = 1 To $drvs[0] 
;On regarde le statut si actif 
If DriveStatus ( $drvs[$i] & " \ " ) = " READY " Then 
;si le fichier 
If FileExists ( $drvs[$i] & " \setuppro.exe " ) Then 
Run ( $drvs[$i] & " \setuppro.exe " ) ; < - c'est ici qu'on lance , car là où il était , cette fonction 
;était lancée que le setup soit détecté ou non 
ExitLoop 
EndIf 
Else 
MsgBox ( 0 , " Office 2003 " , " Veuillez insérer le CD d'Office 2003 " ) 
EndIf 
Next 
EndIf
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#16

Message par sylvanie »

pour le deuxième script proposé par Ani, ce dernier propose une fonctionnalité suplémentaire : il guette l'insertion du média, voici la version retouchée vis à vis des deux trois points buggant :

Code : Tout sélectionner

$old_status = " NOTREADY " ; ça c'est pour dire que l'ancien statu du cdrom était " vide " 
while 1 ; boucle infinie dédier à contrôler l'insertion du média 
$drvs = DriveGetDrive ( " CDROM " ) 
For $indice = 1 To $drvs[0] 
$status = DriveStatus ( $drvs[$indice] ) 
; si le lecteur a un cd et que juste avant il en avait pas 
If $status = " READY " And $old_status = " NOTREADY " Then 
$old_status = " READY " ; < - - le cd est dans le lecteur donc faudra pas relancer tout ça au prochain passage , sinon tu vas lancer ton appli tant que le cd est dans le lecteur...If FileExists ( $drvs[$i] & " \setuppro.exe " ) Then 
If FileExists ( $drvs[$indice] & " \setuppro.exe " ) Then 
Run ( $drvs[$indice] & " \setuppro.exe " ) 
Exit 0 
Else 
ConsoleWrite ( $drvs[$indice] & @CRLF ) 
EndIf 
EndIf 
Next 
$old_status = $status ; le statu actuel devins l'ancien pour le prochain tours de boucle , si entre temps le cd a été éjecter , ça repasse donc à NOTREADY et le test d'avant est " réamorcé " sleep ( 10000 ) ; 10 sec entre deux check , car si t'arrives à éjecter , insérer un cd et refrmé le lecteru en 1 ms je te paie une bière , et surtout , je suis pas sur que ton lecteur apprécie d'être autant solicité ... 
Sleep ( 5000 ) ; pause de 5 secondes entre chaque check 
WEnd
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

#17

Message par eln »

J'ai trouvé une autre solution. L'inconvénient de celle que tu présentes est que une fois que la variable $i est égale à "0", elle le reste.

Code : Tout sélectionner

$drvs = DriveGetDrive ( " CDROM " ) 
If Not @error Then $i = $drvs[0] 
While 1
If $i = 0 Then MsgBox ( 0 , " Office 2003 " , " Veuillez insérer le CD d'Office 2003 " ) 
if $i < = 0 Then $i = $drvs[0] 
if DriveStatus ( $drvs[$i] ) = " Ready " And FileExists ( $drvs[$i] & " \setuppro.exe " ) Then ExitLoop 
$i = $i - 1 
Sleep ( 100 ) 
WEnd
MsgBox ( 4096 , " " , " Lettre CD - Rom Office : " & $drvs[$i] )
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#18

Message par sylvanie »

$i ne peut jamais être égale à 0 dans ce script (va de 1 au nbre de lecteurs). Cependant je vois où tu veux en venir, tu veux faire boucler le script tant qu'on n'a pas mis le CD, donc suffit d'inclure ce script dans un while après détermination du nbre de lecteurs, comme tu l'as fait, ou comme le second script présenté par Ani

par contre, attention, tu as une erreur d'utilisation potentielle dans le tiens, cf commentaire :

Code : Tout sélectionner

$drvs = DriveGetDrive ( " CDROM " ) 
If Not @error Then $i = $drvs[0] ; $i = nbre max de lecteur CD trouvé en cas de réussite 
; ici aucun traitement d'erreur , du coups si @error ci dessus vaut 1 alors on continue le script et on s'emplafone une erreur 
While 1 
If $i = 0 Then MsgBox ( 0 , " Office 2003 " , " Veuillez insérer le CD d'Office 2003 " ) 
if $i < = 0 Then $i = $drvs[0] 
if DriveStatus ( $drvs[$i] ) = " Ready " And FileExists ( $drvs[$i] & " \setuppro.exe " ) Then ExitLoop 
$i = $i - 1 
Sleep ( 100 ) 
WEnd 
MsgBox ( 4096 , " " , " Lettre CD - Rom Office : " & $drvs[$i] )
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
eln
Niveau 6
Niveau 6
Messages : 202
Enregistré le : sam. 28 juil. 2007 12:54
Status : Hors ligne

#19

Message par eln »

sylvanie a écrit : ; ici aucun traitement d'erreur , du coups si @error ci dessus vaut 1 alors on continue le script et on s'emplafone une erreur
Alors que faire ?

Code : Tout sélectionner

$drvs = DriveGetDrive ( " CDROM " ) 
If Not @error Then 
EndIf 
$i = $drvs[0]  
:?:
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

#20

Message par SurPriseS »

j'aurais dit un truc dans le genre :

Code : Tout sélectionner

If @error Then 
MsgBox ( 0 , "Erreur" , "Une erreur est survenue " ) 
Exit
else $i = $drvs[0]
Bon c'est peut être un peu radicale ^^
Répondre