Wie wird der cmd.exe xcopy befehl gehandled?

  • Hallo Leute,
    ich hab in einem anderen Thread ein Script geschrieben, bei dem die ausgewählten Add-Ins für ein Programm installiert werden.
    Einige Add-Ins bestehen aus einem extra Ordner, da diese mit .net registriert werden müssen (alle Add-Ins bestehen aus DLLs).

    Da dieses Script (vorerst) nur intern zum Einsatz kommen soll wurde es ziemlich statisch geschrieben (eigentlich kein Thema). Jetzt stellt sich mir die Frage, wie Windows / AutoIt mit folgendem Code umgeht:

    Spoiler anzeigen
    [autoit]

    If $InsKissyII Then
    Run('cmd.exe /c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\Kissy-II" "' & @ProgramFilesDir & '\Mesap4\Kissy-II\"', "", @SW_HIDE)
    Run('cmd.exe /c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\Infragistics-Dlls" "' & @ProgramFilesDir & '\Mesap4\Kissy-II\"', "", @SW_HIDE)
    Sleep(750)
    Run('cmd.exe /c "%windir%\Microsoft.NET\Framework\v2.0.50727\Regasm" /codebase M4AddIn028.dll', "", @SW_HIDE)
    EndIf
    If $InsAnalystExport Then
    Run('cmd.exe /c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\AnalystExport" "' & @ProgramFilesDir & '\Mesap4\AnalystExport\"', "", @SW_HIDE)
    Run('cmd.exe /c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\Infragistics-Dlls" "' & @ProgramFilesDir & '\Mesap4\AnalystExport\"', "", @SW_HIDE)
    Sleep(750)
    Run('cmd.exe /c "%windir%\Microsoft.NET\Framework\v2.0.50727\Regasm" /codebase M4AddIn032.dll', "", @SW_HIDE)
    EndIf
    If $InsKonverter Then
    Run('cmd.exe /c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\Konverter-II" "' & @ProgramFilesDir & '\Mesap4\Konverter-II\"', "", @SW_HIDE)
    Run('cmd.exe /c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\Infragistics-Dlls" "' & @ProgramFilesDir & '\Mesap4\Konverter-II\"', "", @SW_HIDE)
    Sleep(750)
    Run('regsvr32.exe /s "' & @ProgramFilesDir & '\Mesap4\Konverter-II\PgmrX120.dll"')
    Run('cmd.exe /c "%windir%\Microsoft.NET\Framework\v2.0.50727\Regasm" /codebase M4AddIn021.dll', "", @SW_HIDE)
    EndIf
    If $InsAtypNetznutzung Then
    Run('cmd.exe /c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\Atypische Netznutzung" "' & @ProgramFilesDir & '\Mesap4\Atypische Netznutzung\"', "", @SW_HIDE)
    Run('cmd.exe /c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\Infragistics-Dlls" "' & @ProgramFilesDir & '\Mesap4\Atypische Netznutzung\"', "", @SW_HIDE)
    Sleep(750)
    Run('cmd.exe /c "%windir%\Microsoft.NET\Framework\v2.0.50727\Regasm" /codebase M4AddIn031.dll', "", @SW_HIDE)
    EndIf
    Sleep(500)

    [/autoit]

    Dabei werden aus 2 Quellordnern Dateien geholt und in einen neuen Ordner geschmissen.
    Leider kam es bereits mehrfach vor, dass ein Teil dieser Operation (es werden nur die eine Hälfte der Dateien kopiert) nicht passiert.

    Gelöst hab ich es, indem ich jeweils eine 3/4 Sekunde zwischen den kopier-operationen Zeit lasse.
    Aber: Wie arbeitet windows diese direkt nach einander ausgeführten Kopierbefehle ab?

    => ordner 1 kopieren
    => ordner erstellen
    => einfügen
    => ordner 2 kopieren
    => einfügen

    Oder eher so:
    => Ordner 1 kopieren, ordner erstellen
    => Ordner 2 kopieren, einfügen
    => einfügen

    Oder in welcher Reihenfolge? ...denn manchmal wurden die Infragistics DLLs als einziges kopiert und manchmal nur die Add-In spezifischen.

    Gruß Scorpion
    PS: Optimierungsvorschläge?

    Einmal editiert, zuletzt von DJScorpion (9. September 2008 um 16:03)

  • Mit dem ComSpec-Makro und RunWait hat es anfangs irgendwie gar nicht geklappt. Aber ich werde es mal ausprobieren, vielleicht lag es nicht daran.

    *Testen*

  • @progandy: xcopy hat viele Vorteile. Es gibt viele Optionen, die Dircopy so nicht kann. Natürlich wenn man diese Optionen nicht braucht (z.B. nur Dateien, die nach einem bestimmten Datum erstellt wurden) und schlicht kopieren will, dann würde ich auch DirCopy bzw. FileCopy wählen.

    Ich hoffe man merkt mir nicht an, dass ich ein alter DOS-Junkie bin :whistling: :D
    Aber mittlerweile wurden fast meine ganzen Batch-Dateien durch Autoit-Skripte ersetzt. :rock:

  • Guten Morgen Leute :)
    ein neuer Tag, ein neuer Versuch =)

    [autoit]

    RunWait(@ComSpec & '/c xcopy /Y "S:\Mesap\7 Produktion\M4 Setup\' & $M4Version & '\aktuellste AddIns\Kissy-II" "' & @ProgramFilesDir & '\Mesap4\Kissy-II\"', "", @SW_HIDE)

    [/autoit]

    macht gar nichts.

    Ich hab gerade (in dem Gedanken, dass es so richtig ist) alle Run('cmd.exe)-Geschichten auf RunWait(@ComSpec & ') geändert...
    Jetzt gar nichts mehr kopiert.

    Was ist falsch?

  • Ein Beispiel das funktioniert

    [autoit]

    RunWait(@ComSpec & " /c " & 'echo d|xcopy /y "'&@DesktopDir&'\123.txt" "' & @DesktopDir&'\123.bak" && pause',"",@SW_HIDE)

    [/autoit]


    Es gibt da einige Probleme bei DOS-Programmen: Du kannst keinen Dateinamen oder Ordnernamen mit Leerzeichen angeben, es muss der also der ganze Pfad mit dem Dateinamen zusätzlich in ein ' oder " gepackt werden. Außerdem wollte xcopy bei mir wissen, ob das Ziel ein Ordner oder eine Datei ist, also schicke ich mit dem ECHO-Befehl noch ein 'd' für Datei an xcopy.

    Ich hoffe damit ist dir geholfen.

    EDIT: Das &&Pause war nur zu Testzwecken und gehört entfernt!!

  • Als erstes mal den xcopy-Aufruf mit den Parametern:
    /e /s /v /c
    zusätzlich aufrufen (DOS-Junkies wissen, warum...)

    am einfachsten wäre ansonsten zur Fehlersuche, den Befehl so in der Kommandozeile abzuschicken.

    Und noch besser: Den Verantwortlichen für das Leerstellengewusel im Pfad die Suppe auslöffeln lassen...

  • zurück zum Text:
    ist /v nicht überflüssig?
    Und das /e /s /c müsste ich doch dann in jeden befehl einsetzen oder?

    PS: Ja Leute ich bin des /?-Parameters mächtig :)

  • /v ist nur zur zusätzlichen Sicherheit, dass wirklich alles geklappt hat beim kopieren.
    /e /s /c /y würde ich bei jedem Befehl einsetzen. /d wenn nur Dateien kopiert werden sollen die neuer sind als die bereits vorhandenen. Rentiert sich vor allem wenn große oder viele Dateien kopiert werden sollen.

  • @progandy: xcopy hat viele Vorteile. Es gibt viele Optionen, die Dircopy so nicht kann. Natürlich wenn man diese Optionen nicht braucht (z.B. nur Dateien, die nach einem bestimmten Datum erstellt wurden) und schlicht kopieren will, dann würde ich auch DirCopy bzw. FileCopy wählen.

    Nun, in dem Beispielcode wird ja auch keine Option verwendet :) ( Im 1.Post ;) ) Daher ist DirCopy einfacher zu verwenden, wie auch du sagst.