Veröffentlicht 21. Juli 20169 j Hallo, Ich stehe vor einer Herausforderung und erhoffemir hier etwas Hilfe. Ich habe ein kleines Script um Dateien auf einen bzw vielen entfernten Rechner zu übertragen. Im Moment muss ich da jede IP des entfernten Rechners nach jedem Kopier Vorgang manuell eingaben. Ich würde gerne dass wenn ich bei der Eingabe anstatt die IP eingebe ein l für Liste eingeben.Dann soll das Script auf die IP.txt zugreifen und Linie für Linie ab arbeiten, bis die Liste durch ist. mein Script sieht imMoemnt so aus: @echo off :start set /p cashdeskc=enter IP of cashdesk to connect: cls if "%cashdeskc%"=="" exit if not exist report md report ping -n 1 %cashdeskc%>nul if errorlevel 1 ( echo %cashdeskc%>>report\noping.txt ) else ( net use \\%cashdeskc%\c$ "work4usvalora" /user:"valora" if not exist \\%cashdeskc%\c$ ( echo %cashdeskc%>>report\false.txt ) else ( call :copy )) goto start :copy md %cashdeskc% xcopy "Z:\20_GK_Release Management\20.40 GK Versionen\V12.08.03.30 final\Installer-Paket\output.diff.12.08.03.30.gkretail\*.*" "\\%cashdeskc%\C$\Utility\V30.2\*.*" /s if errorlevel 1 (echo %cashdeskc% errorlevel = %errorlevel% >>report\error.txt) net use \\%cashdeskc%\c$ /delete set cashdeskc= goto start Habe nach CLS das hier probiert: if "%cashdeskc%"=="l" ( FOR /f %%f IN (ip.txt) DO echo %%f ) Was aber leider nicht zum Erfolg führt. Über Hilfe würde ich mich freuen. Danke im voraus
21. Juli 20169 j Die FOR-Schleife ist schon mal gut. Das Drumherum müsstest du aber etwas anpassen, dass es alles in der Schleife läuft und die Sprungmarken passen. Statt %cashdeskc% wird die Variable %%f genutzt.
21. Juli 20169 j Autor OK habe nun den Code soweit geändert auf: Quote if "%cashdeskc%"=="l" ( FOR /f %cashdeskc% IN (ip.txt) DO echo %cashdeskc% ) Doch die CMD Box schmiert nach eingabe von l ab.
21. Juli 20169 j Mit falscher Syntax und Logik funktioniert es natürlich nicht ... Überleg doch mal, was das übersetzt heisst, was du im Code geschrieben hast. wenn Variable cashdeskc den Input "l" bekommt, führe aus: FOR /f "l" IN (ip.txt) DO echo "l" Macht das für dich Sinn? Also für mich nicht wirklich... Schreib mal bitte deinen kompletten Code hier rein, den du aktuell verwendest. Ich weiß grad nciht, ob du irgendwo einfach etwas reingepackt hast und Variablen falsch verwendet werden, oder nicht definiert sind, oder ob ein anderer Fehler vorliegt. Aktuell verwendest du "Variablen" (%name%) statt "Parameter" (%%buchstabe). Der Unterschied ist, dass %%buchstabe bei jedem Durchlauf der FOR-Schleife mit einem neuen Wert belegt wird. Die Variable %name% hingegen wird nur einmal vor Aufruf der FOR-Schleife mit einem Wert belegt und dieser Wert verändert sich nicht. Somit entspricht die Syntax nicht der Vorgabe und es kommt zu einem Fehler. Oben hattest du die Syntax richtig. Was genau meintest du da mit "Was aber leider nicht zum Erfolg führt."? Bekommst du eine Fehlermeldung, oder bekommst du nicht den gewünschten Output? Wird der richtige Pfad zur datei verwendet? Packe ich das hier in eine .bat-Datei und ein paar IP-Adressen in die Liste, dann zeigt er mir die IP-Adressen nacheinander an. @echo off for /F %%f in (liste.txt) do ( echo %%f ) Wenn die Ausgabe bei dir nicht funktioniert, liegt es jedenfalls nicht an diesem Teil, sondern eventuell gelangt das Programm gar nicht erst bis zu diesem Teil oder hängt sich wegen etwas anderem auf.
21. Juli 20169 j Autor Wenn ich eine IP Adresse eingebe dann funktioniert das kopieren. Wenn er fertig ist, dann springt er zur eingabe zurück und ich kann eine weitere Ipadresse eingeben. Da ich aber sehr viele PC versorgen soll möchte ich eine Datei erstellen (ip.txt),wo cih per Zeile eine IP Adresse eintrage. Wenn cihd as Script dann aufrufe und anstatt eine IP Adresse eingeben ein L eingebe soll er die Datei abarbeiten. Eine Zeile nach der anderen bis er fertig ist. Hier mein jetziger CODE @echo off :start set /p cashdeskc=enter IP of cashdesk to connect: cls if "%cashdeskc%"=="l" ( FOR /f %cashdeskc% IN (ip.txt) DO echo %cashdeskc% ) if "%cashdeskc%"=="" echo test if not exist report md report ping -n 1 %cashdeskc%>nul if errorlevel 1 ( echo %cashdeskc%>>report\noping.txt ) else ( net use \\%cashdeskc%\c$ "XXXXXX" /user:"XXXXX" if not exist \\%cashdeskc%\c$ ( echo %cashdeskc%>>report\false.txt ) else ( call :copy )) goto start :copy md %cashdeskc% xcopy "Z:\20_GK_Release Management\20.40 GK Versionen\V12.08.03.30 final\Installer-Paket\output.diff.12.08.03.30.gkretail\*.*" "\\%cashdeskc%\C$\Utility\V30.2\*.*" /s if errorlevel 1 (echo %cashdeskc% errorlevel = %errorlevel% >>report\error.txt) net use \\%cashdeskc%\c$ /delete set cashdeskc= goto start Ich meine er gibt keinen Error aus sondern schliesst die Box. Ohne diesen Code: if "%cashdeskc%"=="l" ( FOR /f %cashdeskc% IN (ip.txt) DO echo %cashdeskc% ) Funktioniert das Script zwar nur mit manueller IP eingabe. Danke für die Hilfe Bearbeitet 21. Juli 20169 j von Ewsg
21. Juli 20169 j Kann ja auch nicht funktionieren, da in %cashdeskc% keine IP-Adresse, sondern der Buchstabe "l" gespeichert wurde. Du musst in der FOR-Schleife statt der Variablen %cashdeskc% den Parameter %%f verwenden, oder den Inhalt jeweils pro Schleifenrunde einmal in die Variable kopieren. Zudem macht es keinen Sinn, die FOR-Schleife dort schon enden zu lassen. Sprungmarken sind hingegen auch wieder eine schlechte Idee, wenn du Schleifen verwendest, da du evtl. dann aus der Schleife springst und sich die Schleife rekursiv wieder aufrufen könnte.
21. Juli 20169 j Autor Das mag sein. Es soll ja auch keine IP in die Variable geschrieben werden. Wenn ich anstatt einer IP Adresse ein l eingebe soll er die Ips aus der Datei nehmen und zu derSprungmarke :copy springen und die Datei abarbeiten Bearbeitet 21. Juli 20169 j von Ewsg
22. Juli 20169 j Auch bei der Sprungmarke :copy steht in der Variablen %cashdeskc% aber nur "l" drin und keine IP, genau wie auch davor. Du versuchst also, "l" anzupingen, ein Netzlaufwerk mit "l" statt mit der IP des PCs zu verbinden, erstellst eventuell ein Verzeichnis "l", versuchst etwas auf "l" zu kopieren, löschst das Netzlaufwerk auf dem rechner "l", usw. ... Korrigier den Teil doch erst einmal und vielleicht behebt das schon dein Problem. Ich würde dafür an deiner Stelle dann eine separate Sprungmarke für die Listenabarbeitung verwenden, so dass die FOR-Schleife erst nach der Sprungmarke kommt, um das Ganze zu vereinfachen. In der FOR-Schleife musst du dann natürlich das Kopieren auch erledigen und darfst nicht wieder zu der Sprungmarke :start springen, da es ansonsten von der Logik her nicht funktioniert, sondern sonst eventuell unendlich oft immer die erste Zeile nur ausgelesen wird. Aktuell machst du mit der ausgelesenen Zeile absolut nichts laut deinem Quelltext. Schau mal, ob es beispielsweise so geht. @echo off %Path% = "Z:\20_GK_Release Management\20.40 GK Versionen\V12.08.03.30 final\Installer-Paket\output.diff.12.08.03.30.gkretail\*.*" :start set /p cashdeskc=enter IP of cashdesk to connect: cls if "%cashdeskc%"=="l" ( goto liste ) else ( if "%cashdeskc%"=="" echo test if not exist report md report ping -n 1 %cashdeskc%>nul if errorlevel 1 ( echo %cashdeskc%>>report\noping.txt ) else ( net use \\%cashdeskc%\c$ "XXXXXX" /user:"XXXXX" if not exist \\%cashdeskc%\c$ ( echo %cashdeskc%>>report\false.txt ) else ( call :copy ) ) ) goto start :copy md %cashdeskc% xcopy "Z:\20_GK_Release Management\20.40 GK Versionen\V12.08.03.30 final\Installer-Paket\output.diff.12.08.03.30.gkretail\*.*" "\\%cashdeskc%\C$\Utility\V30.2\*.*" /s if errorlevel 1 (echo %cashdeskc% errorlevel = %errorlevel% >>report\error.txt) net use \\%cashdeskc%\c$ /delete set cashdeskc= :liste FOR /f %%f IN (ip.txt) DO ( echo %%f ping -n 1 %%f>nul if errorlevel 1 ( echo %%f>>report\noping.txt ) else ( net use \\%%f\c$ "XXXXXX" /user:"XXXXX" if not exist \\%%f\c$ ( echo %%f>>report\false.txt ) else ( md %%f xcopy %Path% "\\%%f\C$\Utility\V30.2\*.*" /s if errorlevel 1 ( echo %%f errorlevel = %errorlevel% >>report\error.txt ) net use \\%%f\c$ /delete ) ) goto start
11. August 20169 j Wäre schön, wenn du das funktionierende Ergebnis hier auch noch posten könntest als Beispiel für nachfolgende User mit dem selben oder einem ähnlichen Problem.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.