Pfad zu einer Datei auf einer CD?

  • hey Leute,

    bin neu hier, und hab gleich ma zwei kleine Fragen.
    Google und die Suchfunktion konnten mir leider nicht weiter helfen.

    Ich sitze hier an einer DVD von der aus ich verschiedene sachen installieren kann.
    Jetzt brauch ich allerdings nen kleines Programm, was nach einer installation (wird getrennt von der installation per knopfdruck gestartet), etwas an dem installierten Programm bzw. an der Registry ändert.

    Das mit der Rgeistry hab ich hinbekommen, aber anschließend soll eine Datei von der DVD runter kopiert werden. Problem hierbei ist nur wie ich dem Programm sage wo sich diese Datei nun befindet, kann ja schlecht einen laufwerkbuchstaben angeben (sind ja von rechner zu rechner anders)
    also die Frage: wie sag ich dem Prog das es sich um einen ordner auf ner CD handelt?

    zum schluss soll eine Datei von der Festplatte gestartet werden. Der Speicherort liegt in Form einer Variable vor, aber ich bekomm nicht hin, dass das Programm auch die Datei ausführt, da ich an den Speicherort auch noch den Datei Namen anhängen muss (oder?).
    also die Frage: Wie sag ich dem Prog welche Datei er starten soll wenn der Speicherpfad nur als Variable vorliegt?

    wäre für jede Hilfe dankbar!

  • hi!

    mit DriveGetDrive ( "type" ) , also in deinem fall:

    DriveGetDrive ( "CDROM" )
    kannst du das CD laufwerk ausgeben lassen:


    [autoit]

    $var = DriveGetDrive( "CDROM" )

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 to $var[0]
    MsgBox(4096,"Drive " & $i, $var[$i])
    Next

    [/autoit]

    das mit dem zum laufen bringen:

    [autoit]

    RUn($exepfad, $pfadzumordnerwodieexeliegt)

    [/autoit]

    Zb so:

    Run("C:\Programme\Huggy.exe", "C:\Programme\")

    Mfg :D

  • Das Problem ist ja, dass ich nicht weiß wo die exe liegt, da der benutzer das in der Installation des Programms festlegt.

    die einzige Möglichkeit den Pfad raus zu bekommen ist das ganze aus der registry raus zu lesen. (funktioniert soweit)
    jetzt hab ich aber den Pfad nur als Variable vorliegen.
    Die exe in den entsprechenden ordner zu kopieren funktioniert auch, allerdings befindet sie sich zu testzecken in einem Ordner auf der Festplatte, nicht in einem Virtuellen oder Physikalischen CD Laufwerk.
    Ich selbst brauch eigentlich gar net zu wissen welchen buchstaben die laufwerke haben, es geht nur darum das das Programm weiß wo sich die Datei befindet, von mir aus auch im selben ordner wie das Programm selbst also so zu sagen im "root" verzeichnis.

    ich hoffe ihr versteht was ich meine XD
    hab gestern erst mit der Sprache angefangen.


    Das mit der exe starten funktioniert ja so genau nicht, die Datei befindet sich noch mit einigen anderen exe Dateien in dem Verzeichnis, und die Variable gibt nur den Pfad zum ordner, nicht direkt zu der exe an. Ansonsten wärs ja kein Problem. Das was ich bräuchte wäre ne kombination aus Variable und Pfad angabe z.B. so

    $Path\die_exe_Datei.exe

    Aber so ne Kombination scheint nicht zu funktionieren. :(

  • super! des funktioniert schon ma :)

    jetzt is nur noch die frage wie man das mit dem laufwerk bewerkstelligen kann.

  • Wie wärs:

    [autoit]


    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    $pfadvonexe = "\Install\exe.exe"

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $cd = DriveGetDrive("CDROM")
    $pfad = $cd[1]

    [/autoit][autoit][/autoit][autoit]

    IF NOT FileExists($pfad & $pfadvonexe) Then
    $pfad = $cd[2]

    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]

    ?

  • Hi

    ich mache das bei meinen Installationsprogrammen so, dass ich der CD/DVD zusätzlich noch nen Namen gebe, da es ja sein kann, dass es mehrere CD Laufwerke oder auch einen USB Stick gibt und frage neben dem LAufwerkstyp noch ab, ob die spezielle CD im Laufwerk ist

    Dann schreibe ich ne kleine .ini Datei auf die Platte die alle Pfadangaben, Angaben zur Hardware usw. enthält. In dieser Datei kann ich auch festhalten wie oft gebootet wurde und ob die Installation schon mal durchgeführt wurde oder nicht. Wenn ich die Installationsquelle gefunden habe kopiere ich alles auf die lokale Platte und von dort aus geht es weiter....

    Ist zwar sicher nicht optimal programmiert, geht aber:

    ; copierroutine
    ; disk_copy()
    func disk_copy()
    ; funktion prüft ob vom Memostick oder CD kopiert werden soll und kopiert alle Installationsdateien in ein Verz. C:\ Install

    ; prüfen on install verzeichnis schon da ist
    If FileExists("C:\install") Then
    ; nothing
    Else
    ; sonst anlegen
    MsgBox(4096,"", "Verzeichnis C:\install ist nicht vorhanden und wird angelegt.",1)
    dircreate("c:\install")
    EndIf

    ; dann schauen welches laufwerk die CD ist
    msgbox(4096,"Installation"," Moment bitte ich überprüfe die Laufwerke",2)
    $var = DriveGetDrive( "all" )
    $stick = 0

    If NOT @error Then
    For $i = 1 to $var[0]
    $var1 = DriveGetType( $var[$i])
    $var2 = DriveGetLabel($var[$i])
    if $var2="DATENTRÄGER" Then ; so heisst der stick
    $stick=1
    $lw=$var[$i]
    ExitLoop
    EndIf
    Next
    Else
    Return 0
    Exit
    EndIf

    if $stick=1 Then
    msgbox(4096,"","Installation erfolgt von einem Memostick erkannt als Laufwerk : "&$lw,1)
    Else
    msgbox(4096,""," CDROM Laufwerk wird überprüft ",1)
    ; cd laufwerk überprüfen
    $var = DriveGetDrive( "all" )
    For $i = 1 to $var[0]
    $var1 = DriveGetType( $var[$i])
    $var2 = DriveGetLabel($var[$i])
    $lw=$var[$i]
    if $var1="CDROM" Then ; kennung der cd1
    msgbox(4096,"","Installation erfolgt von einer CDROM, erkannt als Laufwerk : "&$lw,1)
    ExitLoop
    Else
    if $i < $var Then
    msgbox(2,""," Kein Laufwerk erkannt, Installation nicht möglich, Programm wird beendet ! ")
    Return 0
    Exit
    EndIf
    EndIf
    Next
    EndIf

    ; wenn von der CD
    if $stick=0 Then
    ; inhalt der CD1 ins Install-verzeichnis kopieren

    usw................

  • aber die If abfrage muss ich doch jenachdem wieviele laufwerke er überprüfen soll wiederholen, oder?
    werden bei dieser abfrage auch virtuelle laufwerke erkannt?

    am ende müsste doch meine kopierzeile so aussehen oder:

    Filecopy($Pfad & $pfadvonexe, $Path)

    $Path ist der Pfad zum ziel verzeichnis

    • Offizieller Beitrag

    Hallo eaglefight!

    Gute Idee! Muss ich mir merken, wenn ich es mal brauchen sollte.
    Allerdings wäre es wesentlich einfacher wenn AutoIt beim
    FileChangeDir("X:\") (wenn "X" das CDROM ist) auch Volume-Namen zulassen würde, also z.B. so:
    FileChangeDir("Volumename:\"), dann könnte man mit @WorkingDir weitermachen.

    MfG. Oscar

  • hab mich mal erbarmt ;)

    Spoiler anzeigen
    [autoit]


    ; von Xero mit freundlicher Unterstützung von Autoit.de :)
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $pfadvonexe = "\Install\exe.exe"
    GLOBAL $ziel = 0 ; so lassen!
    $cd = DriveGetDrive("CDROM") ; so lassen^^
    $pfad = $cd[1]
    $ziel = "hier bitte Eintragen, oder diese Zeile löschen um einen FileSelectFolder zu erzwingen!"
    if $ziel = "" Then
    $ziel = FileSelectFolder("Zielordner auswählen", "")
    EndIf
    For $i = 1 to UBound($cd[0])
    IF NOT FileExists($pfad & $pfadvonexe) Then
    $i = $i + 1

    $pfad = $cd[$i]
    EndIf
    sleep(3000)
    Next
    sleep(2000)
    FileCopy($pfad&$pfadvonexe, $ziel)
    Sleep(2000)
    If NOT FileExists($ziel & "\exe.exe") Then ; <-- BITTE MIT DEINEM DATEI NAMEN AUSTAUSCHEN

    MsgBox(0, "ERROR!", "es ist ein Fehler aufgetreten" & @Crlf & "Bitte probieren Sie es erneut!")

    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • erstma vielen dank für die Mühe die du dir gemacht hast, allerdings scheint das ganze noch net so zu funktionieren.

    hier is ma der quellcode wie er bei mir aussieht:

    Spoiler anzeigen
    [autoit]


    ; von Xero mit freundlicher Unterstützung von Autoit.de :)
    #include <Array.au3>
    $Path = Regread("HKEY_LOCAL_MACHINE\SOFTWARE\Blizzard Entertainment\Warcraft II BNE", "War2Edit")
    $pfadvonexe = "\Autoplay\Docs\Patches etc\Warcraft Stuff\Warcraft 2 Stuff\Warcraft2_patch.exe"
    $Pfadzweiteexe = "\Autoplay\Docs\Warcraft 2\Install.exe"
    GLOBAL $ziel = 0 ; so lassen!
    $cd = DriveGetDrive("CDROM") ; so lassen^^
    $pfad = $cd[1]
    $ziel = $Path
    if $ziel = "" Then
    $ziel = FileSelectFolder("Bitte Installations Ordner auswählen", "")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to UBound($cd[0])
    IF NOT FileExists($pfad & $pfadvonexe) Then
    $i = $i + 1

    $pfad = $cd[$i]
    EndIf
    sleep(3000)
    Next
    sleep(2000)
    FileCopy($pfad&$pfadvonexe, $ziel)
    Filecopy($pfad&$Pfadzweiteexe, $Ziel)
    Sleep(2000)
    If NOT FileExists($ziel & "\Warcraft2_patch.exe") Then ; <-- BITTE MIT DEINEM DATEI NAMEN AUSTAUSCHEN

    MsgBox(0, "ERROR!", "es ist ein Fehler aufgetreten" & @Crlf & "Bitte probieren Sie es erneut!")

    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Regwrite("HKEY_LOCAL_MACHINE\SOFTWARE\Blizzard Entertainment\Warcraft II BNE", "War2CD", "Reg_SZ", $Path)
    Run($Path & "\Warcraft2_patch.exe")
    exit

    [/autoit]

    vll. hab ich auch nur irgentwas falsch eingestellt, aber ich bekomm immer die Fehler meldung das er die Datei nicht findet.
    ich hab die entsprechenden Dateien mit der compilierten exe in ein CD image gepackt und in ein Virtuelles Laufwerk gelegt, liegts vll daran? (die ordner strucktur ist natürlich so wie im Code ;) )

  • hi :D

    Debugg bitte mal so, also schau ob alle werte in der MsgBox richtig sind.

    Spoiler anzeigen
    [autoit]


    ; von Xero mit freundlicher Unterstützung von Autoit.de :)
    #include <Array.au3>
    $Path = Regread("HKEY_LOCAL_MACHINE\SOFTWARE\Blizzard Entertainment\Warcraft II BNE", "War2Edit")
    $pfadvonexe = "\Autoplay\Docs\Patches etc\Warcraft Stuff\Warcraft 2 Stuff\Warcraft2_patch.exe"
    $Pfadzweiteexe = "\Autoplay\Docs\Warcraft 2\Install.exe"
    GLOBAL $ziel = 0 ; so lassen!
    $cd = DriveGetDrive("CDROM") ; so lassen^^
    $pfad = $cd[1]
    $ziel = $Path
    if $ziel = "" Then
    $ziel = FileSelectFolder("Bitte Installations Ordner auswählen", "")
    EndIf

    For $i = 1 to UBound($cd[0])
    IF NOT FileExists($pfad & $pfadvonexe) Then
    $i = $i + 1

    $pfad = $cd[$i]
    EndIf
    sleep(3000)
    Next
    sleep(2000)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "Pfad", $Path)
    MsgBox(0, "Pfad EXE1" , $pfadvonexe)
    MsgBox(0, "Pfad exe2", $Pfadzweiteexe)
    MsgBox(0, "laufwerk", $pfad)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "Pfad gesamt 1", $pfad&$pfadvonexe)
    MsgBox(0, "Pfad gesamt 2", $pfad&$Pfadzweiteexe)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    FileCopy($pfad&$pfadvonexe, $ziel)
    Filecopy($pfad&$Pfadzweiteexe, $Ziel)
    Sleep(2000)
    If NOT FileExists($ziel & "\Warcraft2_patch.exe") Then ; <-- BITTE MIT DEINEM DATEI NAMEN AUSTAUSCHEN

    MsgBox(0, "ERROR!", "es ist ein Fehler aufgetreten" & @Crlf & "Bitte probieren Sie es erneut!")

    EndIf


    Regwrite("HKEY_LOCAL_MACHINE\SOFTWARE\Blizzard Entertainment\Warcraft II BNE", "War2CD", "Reg_SZ", $Path)
    Run($Path & "\Warcraft2_patch.exe")
    exit

    [/autoit]

    Mfg,


    Huggy =D

  • nein die Pfade stimmen nicht, es versucht nur auf dem ersten CDrom laufwerk die Dateien zu finden.
    Da sind sie logischerweise nicht, da sie in einem Virtuellen laufwerk liegen (gesucht wird in G: Dateien sind in I:)

    also muss das Problem an der If abfrage für das laufwerk liegen, da die nicht weiterspringt um die anderen Laufwerke zu überprüfen.

    /€ hab grad ma nen bisl gesucht und bin auf die "do...until" abfrage gestoßen.

    könnt man nicht die if abfrage so langlaufen bis er die Datei gefunden hat?

    also so ca:

    [autoit]


    do
    For $i = 1 to UBound($cd[0])
    IF NOT FileExists($pfad & $pfadvonexe) Then
    $i = $i + 1

    $pfad = $cd[$i]
    EndIf

    [/autoit][autoit][/autoit][autoit]

    sleep(3000)
    Next
    until Fileexists($Pfad&$Pfadvonexe) = true

    [/autoit]

    PS: habs grad ma Probiert, aber in der Form scheint es nicht zu gehen, da er immer noch nur auf g: sucht bzw. das laufwerk dann für den Pfad verwendet.

    Einmal editiert, zuletzt von Xero (19. Juni 2007 um 18:40)

  • ja so ähnlich:

    Ich hab hier ne DVD von der zwei Dateien runterkopiert werden sollen.
    Das Problem ist nun, dass jenachdem wer die DVD verwendet sich die Laufwerkbuchstaben unter scheiden können.
    Der erste leg die DVD z. B. ins laufwerk g: ,der nächste in H: und noch jemand anderes erstellt sich nen image und legst ins virtuelle laufwerk Z:.
    Das Programm muss jetzt natürlich rausfinden in welchen Laufwerk es sich befindet um die Dateien runter kopieren zu können.

    Allerdings gestaltet sich das schwer als ich gedacht hatte XD

  • also so in der richtung:

    [autoit][/autoit][autoit][/autoit][autoit]

    if
    FileExists("a:\Autoplay\Docs\Patches etc\Warcraft Stuff\Warcraft 2 Stuff\Warcraft2_Patch.exe")
    then
    FileCopy("a:\Autoplay\Docs\Patches etc\Warcraft Stuff\Warcraft 2 Stuff\Warcraft2_Patch.exe", $Path)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    if
    FileExists("b:\Autoplay\Docs\Patches etc\Warcraft Stuff\Warcraft 2 Stuff\Warcraft2_Patch.exe")
    Then
    Filecopy("b:\Autoplay\Docs\Patches etc\Warcraft Stuff\Warcraft 2 Stuff\Warcraft2_Patch.exe", $Path)
    Endif

    [/autoit][autoit][/autoit][autoit]

    ;etc etc

    [/autoit]

    aber da würd der alle buchstaben abklappern auch wenn ders schon gefunden hat, macht das sinn?

    2 Mal editiert, zuletzt von Xero (19. Juni 2007 um 19:06)

    • Offizieller Beitrag

    Hi,

    was du brauchst weißt nur du, aber so ungefähr:

    [autoit]

    _copy('Autoplay\Docs\Patches etc\Warcraft Stuff\Warcraft 2 Stuff\Warcraft2_Patch.exe', $path, 9)

    [/autoit][autoit][/autoit][autoit]

    Func _copy($from, $to, $flag)
    For $i = 65 To 90
    If FileExists(Chr($i) & ':\' & $from) Then
    FileCopy(Chr($i) & ':\' & $from, $to, $flag)
    ExitLoop
    EndIf
    Next
    EndFunc ;==>_copy

    [/autoit]

    So long,

    Mega

  • hmm, also ich komm mit deinem Script nich so ganz zurecht, bin noch komplett neu bei der Sprache ;)

    Ich hab die Variablen "From", und "to" meinen Bedürfnissen angepasst.
    wenn ichs richtig verstehe geht er die Zahlen (Buchstaben?) 65 bis 90 durch und Probiert die als Laufwerkbuchstabe. und überprüft ob die entsprechende datei vorhanden ist (in diesem Fall die Datei "Autoplay\Docs\Patches etc\Warcraft Stuff\Warcraft 2 Stuff\Warcraft2_Patch.exe")
    wenn sie vorhanden ist kopier er sie wenn net, probiert er die nächste Zahl, oder?

    was ich nicht verstehe ist die erste Zeile mit dem _copy, für was steht das?
    die Hilfe hat mir nix zu _copy auspucken können. wenn ich versuche das Script mit dieser Zeile zu starten kommt ne Fehler Meldung, ohne geht es, aber es kopiert immer noch nicht die Datei.

    wäre super wenn du mir auf die Sprünge helfen könntest.

    • Offizieller Beitrag

    Hi,

    die Funnktion ist eine udf user defined function. Sprich selbstgeschriebene Funktion. Diese wird in der ersten Zeile einfach nur aufgerufen.

    Ein Funktion oder Nutzung ergibt wenig Sinn. :)

    So long,

    Mega

    P.S.: Was die Func tut, hast du aber richtig erkannt. Du musst den Zielpfad auch angeben und das Flag, so als würdest du FilCopy standard nutzen!