Skript zum Verschieben von Dateien und Ordnern via admin. Freigabe

  • Hallo zusammen,

    AutoIT ist eine richtige Sucht ;) Nun bitte ich Euch einmal um Rat über den Aufbau meines nachfolgenden Vorhabens - ohne, dass ich für jeden PC eine eigene EXE erstelle ;)

    In meinem Netzwerk gibt es ca. 15 Rechner, welche innerhalb der Domäne sind. Via C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\Autostart kann ich beispielsweise eine AutoIT-Exe legen, welche eine Installation vornimmt und sich anschließend selbst löscht. Diesen Schritt muss ich aber manuell vornehmen und dabei stets warten, bis die jeweiligen Rechner online sind.

    Ich stelle mir ein Skript mit einer Schleife vor, welches zunächst - beispielsweise aus einer Text-Datei - alle Rechnernamen ausliest und dann nacheinander versucht, diese Rechner zu erreichen. Wird ein Rechner nicht erreicht, geht es weiter zum nächsten. Wird einer erreicht, wird der Inhalt aus C:\bla bla\* rüberkopiert in z.B. das o.g. Verzeichnis. Wenn keine Rechner mehr "fällig" sind, wird das Skript beendet.

    Wie würdet ihr es angehen? Danke ;)

  • Ich glaube ich würde es so in der art machen:
    Ich würde auf jeden der 15 PC´s ein aus autoit erstellten TCP-clienten legen (wobei am besten der port immer anders sein sollte) der wenn er den befehl bekommt eine gewünschte funktion ausführt.
    Und auf dem hauprechner einfach den TCP server wo du bestimmen kannst, welche funktion an welchen Port/Pc vorgenommen werden kann.
    über netzwerke ist das mit tcp am einfachsten.
    Hier ein tcp tutorial
    Ich würde einfach so machen das ein string verschickt wird z.B: "COPY|C\test\test.txt|C:\test2.txt"
    der dann vom Clienten mit Stringsplit("String","|") geteilt wird und mit einer If abfrage getestet wird welcher befehl den verschickt wurde, in dem fall: "COPY" und führt dann die gewünschten funktionen aus.

    Ich hoffe ich hab verständlich geschrieben,
    mfg.

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Danke, danke ;) Ich wollte aber ganz bewusst auf etwas auf der Seite des Clients verzichten.

    Wie würdet ihr hier vorgehen, dass er prüft, ob ein Rechner online ist - wenn ja, Kopiervorgang und aus der Liste löschen - wenn nein, nächsten Rechner nehmen und mit dem weiter machen?

  • Hi, das is mir klar ;) Mir geht es nur darum, dass das Skript alle Rechnernamen z.B. aus ner INI-Datei ausliest und dann nacheinander versucht, die zu erreichen (es gibt ja auch Notebooks, die z.B. nicht immer an sind). Das Skript soll erst enden, wenn alle Rechner erreicht wurden, sprich alle die Datei erhielten. Markierung wäre ja z.B. durch ne Variable, die 0 oder 1 annehmen kann, in der INI-Datei denkbar. Idee?

  • Sowas?

    [autoit]

    $ONLINE_PC1 = 0
    $ONLINE_PC2 = 0
    $ONLINE_PC3 = 0

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

    While 1
    If Ping(IniRead("ini.ini","MAIN","PC1","0")) <> 0 Then $ONLINE_PC1 = 1
    If Ping(IniRead("ini.ini","MAIN","PC2","0")) <> 0 Then $ONLINE_PC2 = 1
    If Ping(IniRead("ini.ini","MAIN","PC3","0")) <> 0 Then $ONLINE_PC3 = 1
    If $ONLINE_PC1 And $ONLINE_PC2 And $ONLINE_PC3 = 1 Then ExitLoop
    WEnd
    MsgBox(0,"","Alle erreicht!")

    [/autoit]

    Ini-Datei:

    Code
    [MAIN]
    PC1=NameOderIpDesErstenPC
    PC2=NameOderIpDesZweitenPC
    PC3=NameOderIpDesDrittenPC

    Dann natürlich noch eine Kopierfunktion einbauen, aber das kann ja danach anstatt der MsgBox kommen...

    LG Chess

  • Ach wie genial :) Mit so etwas bastle ich auch schon rum, mein Problem ist nur bisher gewesen, dass ich nicht wusste, wie ich damit umgehe, wenn alle Rechner online sind :) Deine INI-Datei sieht aus, wie meine ;)

    Drei Fragen noch:

    Wo würdet ihr jeweils den Kopiervorgang einleiten? Direkt unter der jeweiligen "If Ping"-Schleife?

    Dann: Was, wenn ich z.B. bei PC 3 keine IP-Adresse angegeben habe? Das Skript soll dann diese Zeile einfach überspringen.

    Und: GIbt es eine Lösung, um zu prüfen, ob der Kopiervorgang vollständig war? Mir geht es darum, dass die Verbindung während des Kopierens getrennt wird?

    Danke :)

  • Erstmal danke für das genial. ;)
    Soo, Fragero Nummero Uno und Tres(o) ;):
    Ich würde das ganze dann so aussehen lassen:

    Spoiler anzeigen
    [autoit]


    $ONLINE_PC1 = 0

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

    $ONLINE_PC2 = 0

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

    $ONLINE_PC3 = 0

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

    $END_PC1 = 1

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

    $END_PC2 = 1

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

    $END_PC3 = 1

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

    While 1

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


    If Ping(IniRead("ini.ini","MAIN","PC1","0")) And $END_PC1 <> 0 Then

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

    $COPY_PC1 = FileCopy("Quelle","Ziel")

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

    If $COPY_PC1 = 1 Then $END_PC1 = 0

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

    $ONLINE_PC1 = 1

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

    EndIf

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

    If Ping(IniRead("ini.ini","MAIN","PC1","0")) And $END_PC1 <> 0 Then

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

    $COPY_PC1 = FileCopy("Quelle","Ziel")

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

    If $COPY_PC1 = 1 Then $END_PC1 = 0

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

    $ONLINE_PC1 = 1

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

    EndIf

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

    If Ping(IniRead("ini.ini","MAIN","PC1","0")) And $END_PC1 <> 0 Then

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

    $COPY_PC1 = FileCopy("Quelle","Ziel")

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

    If $COPY_PC1 = 1 Then $END_PC1 = 0

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

    $ONLINE_PC1 = 1

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

    EndIf

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

    If $ONLINE_PC1 And $ONLINE_PC2 And $ONLINE_PC3 = 1 Then ExitLoop

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

    WEnd

    [/autoit]

    Zu Nummer 2... hm...
    Würde ich vorher vor der While 1-Schleife einen IniRead machen, ungefähr so:

    [autoit]


    $EINGETRAGEN_PC1 = 1

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

    If IniRead("ini.ini","MAIN","PC1","0") = "" Then $EINGETRAGEN_PC1 = 0

    [/autoit]


    Oder mit If, Then und Else, ist ja egal.
    Und dann würde ich die einzelnen If-Blöcke mit dem Ping in sowas setzen:

    [autoit]


    If $EINGETRAGEN_PC1 = 1 Then

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

    ;If-Block mit Ping für PC1

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

    EndIf

    [/autoit]

    Ich hoffe ich hab dich richtig verstanden. ;)

    LG chess

    PS: Sorry wegen den Zeilenabständen^^

  • Jipp, danke. Das mit dem $END_PC ist eben wichtig, sonst würde er ja ständig die Kopiervorgänge wiederholen.

    Und wenn er dann erkennt, dass in der INI-Datei z.B. PC3 leer ist - wie soll dann Deine Bedingung mit dem Online-PC klappen? ^^ Indem man neben $EINGETRAGEN_PC1 = 0 auch noch Online = 1 setzt?

  • Ups, da hab ich was übersehen ;)
    Beim testen wärs mir aufgefallen, aber das ist alles theoretisches Script...

    Nein, das würde nicht klappen^^

    [autoit]


    If $EINGETRAGEN_PC1 = 1 Then
    ;If-Block mit Ping für PC1
    Else
    $ONLINE_PC1 = 1
    EndIf

    [/autoit]

    Weil sonst steht ja schon vor der While-Schleife fest, dass angeblich alle PC's erreichbar sind... oder ich hab wieder was übersehen;)

    LG chess

    PS: Oh, deins würde doch klappen, ich hab grad auf das falsche $EINGETRAGEN_PC1 geguckt... du meinst das hinter dem IniRead, nich?;)

  • Hallo zusammen,

    exakt wegen dieser For-Schleife wende ich mich noch einmal an Euch :)

    Mein Skript sieht derzeit so aus:

    [autoit]

    #include <file.au3>
    $IniPfad = "C:\XXX\Verteilung\XXX.ini"
    Local $PC2
    Local $PC2
    Local $PC3
    Local $PC4
    Local $PC5
    Local $PC6
    Local $PC7
    Local $PC8
    Local $PC9
    Local $PC10
    Local $PC11
    Local $PC12
    Local $PC13
    Local $PC14
    Local $PC15
    Local $PC16
    Local $PC17
    Local $PC18
    Local $PC19
    Local $PC20
    $END_PC1 = 1
    $END_PC2 = 1
    $END_PC3 = 1
    $END_PC4 = 1
    $END_PC5 = 1
    $END_PC6 = 1
    $END_PC7 = 1
    $END_PC8 = 1
    $END_PC9 = 1
    $END_PC10 = 1
    $END_PC11 = 1
    $END_PC12 = 1
    $END_PC13 = 1
    $END_PC14 = 1
    $END_PC15 = 1
    $END_PC16 = 1
    $END_PC17 = 1
    $END_PC18 = 1
    $END_PC19 = 1
    $END_PC20 = 1
    While 1
    $PC2 = IniRead($IniPfad,"MAIN","PC1","X")
    If $PC2 = "X" then
    $END_PC1 = 0
    Else
    If Ping($PC2) And $END_PC1 <> 0 Then
    $COPY_PC1 = DirCopy("C:\XXX\UVNC\", "\\" & $PC2 & "\c$\XXX\UVNC",1)
    _FileWriteLog("C:\XXX\Verteilung\log.txt", $PC2 & " - Kopieren erfolgreich")
    If $COPY_PC1 = 1 Then $END_PC1 = 0
    EndIf
    EndIf

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

    $PC2 = IniRead($IniPfad,"MAIN","PC2","X")
    If $PC2 = "X" then
    $END_PC2 = 0
    Else
    If Ping($PC2) And $END_PC2 <> 0 Then
    $COPY_PC2 = DirCopy("C:\XXX\UVNC\", "\\" & $PC2 & "\c$\XXX\UVNC",1)
    _FileWriteLog("C:\XXX\Verteilung\log.txt", $PC2 & " - Kopieren erfolgreich")
    If $COPY_PC2 = 1 Then $END_PC2 = 0
    EndIf
    EndIf

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

    $PC3 = IniRead($IniPfad,"MAIN","PC3","X")
    If $PC3 = "X" then
    $END_PC3 = 0
    Else
    If Ping($PC3) And $END_PC3 <> 0 Then
    $COPY_PC3 = DirCopy("C:\XXX\UVNC\", "\\" & $PC3 & "\c$\XXX\UVNC",1)
    _FileWriteLog("C:\XXX\Verteilung\log.txt", $PC3 & " - Kopieren erfolgreich")
    If $COPY_PC3 = 1 Then $END_PC3 = 0
    EndIf
    EndIf

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

    (...)

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

    Sleep(5000)
    If $END_PC1 And $END_PC2 And $END_PC3 And $END_PC4 And $END_PC5 And $END_PC6 And $END_PC7 And $END_PC8 And $END_PC9 And $END_PC10 And $END_PC11 And $END_PC12 And $END_PC13 And $END_PC14 And $END_PC15 And $END_PC16 And $END_PC17 And $END_PC18 And $END_PC19 And $END_PC20 = 0 Then ExitLoop
    WEnd
    msgbox(0,"","Alle Übertragungen abgeschlossen !")

    [/autoit]

    Wer kann mir helfen, hier eine Schleife einzubauen, so dass ich nicht für 20 PC's die Passage kopieren muss :D

    Danke.

  • Wie wäre es damit?
    // ist natürlich ungetestet ^^ aber sollte in etwa so hinhauen

    Spoiler anzeigen
    [autoit]


    #include <file.au3>
    Global $strININame = "Clients.ini", $strCopyDir = "\\srv1\dir1\sonstwas", $strLogData = "Clients-Log.txt"
    While 1
    _CopyData()
    Sleep(100)
    WEnd
    Func _CopyData()
    Local $aClients = IniReadSection($strININame,"Clients")
    If UBound($aClients)-1 = 0 Then Exit ; kein Client mehr vorhanden
    For $i = 1 To UBound($aClients)-1
    If Ping($aClients[$i][1] <> 0 Then
    DirCopy($strCopyDir,'\\'&$aClients[$i][1]&'\c$\Dir')
    _FileWriteLog($strLogData, $aClients[$i][1] & " - Kopieren erfolgreich")
    IniDelete($strINiName,"Clients",$aClients[$i][1])
    EndIf
    Next
    EndFunc

    [/autoit]
  • Vielen Dank, aber der wird böse: ^^


    [autoit]

    P:\AutoIT\test.au3(11,39) : ERROR: syntax error
    If Ping($aClients[$i][1] <> 0 Then
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    P:\AutoIT\test.au3(12,65) : ERROR: multi-line 'If' missing 'Then'.
    DirCopy($strCopyDir,'\\'&$aClients[$i][1]&'\c$\Dir')
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    P:\AutoIT\test.au3(15,9) : ERROR: missing Next.
    EndIf
    ~~~~~~~~^
    P:\AutoIT\test.au3(10,16) : REF: missing Next.
    For $i = 1 To
    ~~~~~~~~~~~~~~~^
    P:\AutoIT\test.au3(15,9) : ERROR: syntax error
    EndIf
    ~~~~~~~~^
    P:\AutoIT\test.au3 - 4 error(s), 0 warning(s)

    [/autoit]

    Sehe ich das richtig, dass er in diesem Skript nicht abprüft, ob die Übertragung fehlerfrei verlief (@Error)? Das wäre wichtig, da ja z.B. per VPN angebundene Rechner plötzlich weg sein könnten.

  • [autoit]

    If Ping($aClients[$i][1] <> 0

    [/autoit]

    Then da fehlt ne schließende Klammer hinter $aClients[$i][1]

  • Wie schon gesagt war nicht getestet

    // eigentlich ist es hier im Fourm aber gefragt selbe mal etwas zu machen bzw den Fehler erst einmal selber zu suchen und nicht gleich nach Hilfe zu rufen, andernfalls wirst du dabei nichts lernen.. möchtest du ein Fertiges Script solltest du im "Scripts mit bzw Ohne Gegenleistung" deinen Thread eröffnen..

    Spoiler anzeigen
    [autoit]


    #include <file.au3>
    Global $strININame = "Clients.ini", $strCopyDir = "C:\TEST", $strLogData = "Clients-Log.txt"
    While 1
    _CopyData()
    Sleep(100)
    WEnd
    Func _CopyData()
    Local $aClients = IniReadSection($strININame,"Clients")
    Local $strCompUNC
    If UBound($aClients) = 0 Then Exit ; kein Client mehr vorhanden
    For $i = 1 To UBound($aClients)-1
    $strCompUNC = '\\'&$aClients[$i][1]&'\c$\CopiedFiles'
    If Ping($aClients[$i][1]) <> 0 Then
    DirCopy($strCopyDir,$strCompUNC)
    If @error Then
    _FileWriteLog($strLogData, $aClients[$i][1] & " - Fehler beim kopieren")
    ContinueLoop
    Else
    _FileWriteLog($strLogData, $aClients[$i][1] & " - Kopieren erfolgreich")
    IniDelete($strINiName,"Clients",$aClients[$i][0])
    Endif
    EndIf
    Next
    EndFunc

    [/autoit]

    das Script funtzt

    Clients.ini

    Spoiler anzeigen


    [Clients]
    1=WKS1
    2=WKS2
    3=WKS3
    ....

    Gruß Marvin

  • Danke. Ich will aber was lernen ;) Nur mit den Arrays habe ich noch meine Probleme. Den Fehler im ersten Skript (falsche Array-Werte - er hatte die Clients nicht aus der Ini gelöscht) habe ich ausgemerzt gehabt ;)

  • Die Error-Abfrage funktioniert nun, habe ich umgeschrieben:

    [autoit]

    $Copy = DirCopy($strCopyDir,$strCompUNC,1)
    If $Copy = 0 Then

    [/autoit]


    Zudem habe ich noch die "1" hinzugefügt, als Überschreiben-Parameter, damit ein bereits vorhandenes Verzeichnis keinen Error erzeugt.

  • Hey,

    [autoit]


    If @error Then
    _FileWriteLog($strLogData, $aClients[$i][1] & " - Fehler beim kopieren")
    ContinueLoop
    Else

    [/autoit]

    hier ist doch schon der Error abgefangen? wieso also noch deine Änderung? verstehe ich nicht..
    und zum "Clients wurden nicht gelöscht.." jep habe ich beim zweiten Script dann geändert, habe den Falschen "Key" angegeben gehabt ;) jetzt passt aber alles

    EDIT: ich würde noch ein WOL in das Script mit einbauen, sonst würde dein Script ja wirklich so lange laufen bis er den Ordner auf jedem Rechner verteilt hat, ist also ein Rechner mal 1 Woche aus würde das Scirpt eine Woche laufen.. mit WOl müsstest du nur einen Moment warten bzw beim nächsten Durchlauf wäre der Computer dann Online und du könntest deine Daten kopieren..

    Gruß Marvin