Zum Inhalt springen

Frage

Geschrieben

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

9 Antworten auf diese Frage

Empfohlene Beiträge

  • 0
Geschrieben

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.

  • 0
Geschrieben

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.

  • 0
Geschrieben

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... :rolleyes:;)

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.

  • 0
Geschrieben (bearbeitet)

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 von Ewsg
  • 0
Geschrieben

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.

 

  • 0
Geschrieben (bearbeitet)

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 von Ewsg
  • 0
Geschrieben

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

 

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...