@scriptdir schlägt nach Wechsel des Laufwerksbuchstabens (in laufender exe) fehl

  • Guten Abend liebe Profis,
    ich möchte einige Programme vom USB-Stick installieren, dafür benötige ich den aktuellen Ausführungspfad des Scripts, was für mich mit @scriptdir kein Problem darstellt.
    Jetzt kommt der Haken (für meine bescheidenen Kenntnisse): Durch die Installation eines USB-Managers ändert sich - während des laufenden Scripts - der Laufwerksbuchstabe des USB-Sticks (in meinem Fall von "L" auf "N"). Nachdem der USB-Manager erfolgreich installiert ist (+ entsprechender Pause per "Sleep") frage ich mit @scriptdir im weiterhin laufenden Script erneut den Scriptpfad ab, bekomme aber immer noch den Pfad angegeben, von dem das Script ursprünglich gestartet wurde ("L:\ ..."), obwohl der Stick mittlerweile in Windows sauber als "N" erkannt wird und damit der Scriptpfad zum Zeitpunkt meiner Abfrage eigentlich N:\ ... lauten müsste!?

    Was muss ich tun, um im laufenden Script - nach Wechsel des Laufwerksbuchstabens - wieder den korrekten Pfad zu bekommen? "Workarounds" wie Neustart oder alle Laufwerke nach einer bestimmten Datei auf dem Stick zu durchsuchen, um damit den Pfad "neu" zu ermitteln möchte ich absolut vermeiden.

    Vielen Dank im Vorraus für Eure Mühen
    Michael

  • Du kannst versuchen per DriveGetDrive alle verbundenen Laufwerke zu ermitteln.
    Unmittelbar vor dem Setup wird die Liste erstellt und unmittelbar danach erneut.

    Dann müsste die Liste bis auf 1 Laufwerk identisch sein.
    Wenn man alle doppelten Einträge löscht bleibt im ersten Array das Alte und im 2ten das Neue Laufwerk zurück.

    Wenn ich das Problem richtig verstanden habe müsste es damit gehen.
    Nachteil ist, dass man wärend der Installation keine Sticks dran oder abhängen darf. sonst sind die Arrays falsch.

  • Danke für den Lösungvorschlag!
    Das Problem ist korrekt erfasst und die Lösung ist gut - da Laufwerk "L" weg und "N" da ist, aber leider könnte ich solch einen Array-Vergleich nicht programmieren, dafür reichen meine Kenntnisse nicht aus!

    Mfg Michael

  • Ich versuch mal was.
    Hab ja einen USB Stick. (leider nur einen, sonst könnte ich den einen dran und den anderen ab machen um die Situation zu simulieren)

    Edit:
    Das müsste so klappen.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Local $aDrivesVorher = DriveGetDrive('ALL')

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

    ; Installation
    ; Entfällt hier, daher wird einfach das
    ; erste Laufwerk im Array umbenannt
    $aDrivesVorher[1] = 'x:' ; Aus dem ersten wird ein x
    ; Das entspricht der Umbenennung eines Laufwerks
    ; Bei der Installation

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

    Local $aDrivesNachher = DriveGetDrive('ALL')

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

    _ArrayDisplay($aDrivesVorher)
    _ArrayDisplay($aDrivesNachher)

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

    _ArrayUnique2($aDrivesVorher, $aDrivesNachher)

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

    ConsoleWrite('! ' & $aDrivesVorher[0] & ' -> ' & $aDrivesNachher[0] & @CRLF)

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

    _ArrayDisplay($aDrivesVorher)
    _ArrayDisplay($aDrivesNachher)

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

    Func _ArrayUnique2(ByRef $a1, ByRef $a2)
    Local $b1 = $a1 ; Kopieren
    For $i = UBound($a1) - 1 To 0 Step -1
    If _StringInArray($a1, $a2[$i]) Then _ArrayDelete($a1, $i)
    Next
    For $i = UBound($a2) - 1 To 0 Step -1
    If _StringInArray($a2, $b1[$i]) Then _ArrayDelete($a2, $i)
    Next
    EndFunc

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

    Func _StringInArray($a, $s)
    For $i = 0 To UBound($a) - 1 Step 1
    If $a[$i] = $s Then Return True
    Next
    Return False
    EndFunc

    [/autoit]

    Danach sollte in beiden Arrays nur 1 Element vorhanden sein, und zwar der geänderte Buchstabe.
    Sollte ein Laufwerk verbunden oder abgeklemmt werden wärend der Installation bleiben mindestens 2 Einträge übrig. (1. die Nummer die sich geändert hat und 2. der Buchstabe des geänderten Laufwerks)

  • Also wenn es wirklich immer L und N ist, dann kannst du doch auch den vollen Pfad verwenden, oder habe ich da etwas falsch verstanden?

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Zitat

    Jetzt kommt der Haken (für meine bescheidenen Kenntnisse): Durch die Installation eines USB-Managers ändert sich - während des laufenden Scripts - der Laufwerksbuchstabe des USB-Sticks (in meinem Fall von "L" auf "N")

    Es handelt sich um eine Installation. Es ist unwahrscheinlich, dass alle Rechner denen dieser Stick verabreicht wird so reagieren wie sein eigener.

  • Aaaaaaah, gut, dann hab ich das wohl übersehen, war auch schon etwas müde ;)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

    • Offizieller Beitrag

    Ich würde anders vorgehen und dem Stick einen Namen (Label) geben. Dann kann man vor der Installation den aktuellen Laufwerksbuchstaben auslesen:

    Spoiler anzeigen
    [autoit]


    ConsoleWrite(_Label2Drive('USB-Stick') & @CR)

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

    Func _Label2Drive($sLabel)
    Local $aDrives = DriveGetDrive('REMOVABLE')
    If @error Then Return SetError(@error, 0, '')
    For $i = 1 To $aDrives[0]
    If $sLabel = DriveGetLabel($aDrives[$i]) Then Return SetError(0, 0, $aDrives[$i])
    Next
    Return SetError(1, 0, 'Not available')
    EndFunc

    [/autoit]
  • Zunächst ganz herzlichen Dank an alle, die ihr wertvolles Hirnschmalz in mein Problem investiert haben!

    @ Mars - vielen Dank für Deine Mühen und die prompte Antwort inclusive Scriptvorschlag - ganz große Klasse! Nur leider bekommen mit der Installation des USB-Managers noch einige andere USB-Laufwerke (z.B. das im Drucker) einen anderen - bzw. bei leeren Laufwerken keinen Buchstaben. Insofern klappt das leider nicht. Dennoch dickes Dankeschön!!!

    @ Oscar - als ich Deinen Beitrag gelesen habe, ist es mir wie schon so oft ergangen: Man fragt sich, warum bin ich nicht eigentlich selbst auf diese Idee gekommen??? Ich tröste mich dann immer damit, dass ein Forum ja von soetwas lebt. Dein Vorschlag scheint mir äußerst praktikabel zu sein, werd' ich nachher noch testen. Ganz herzlichen Dank!!!

    Mich beschäftigt dennoch, warum der 2. @scriptdir - Aufruf den vorherigen Pfad wiedergibt, bei @workingdir hätte ich das verstanden, aber so?

    MfG Michael