Fragen zu Batchausführung mit Parameterübergabe und Verzeichnisexistenz-Abfrage
Hi Leute,
habe folgendes Sorgenkind: Batch mit dem Aufruf Batch.bat "C:\.....\Datei1.txt" soll in Verzeichnis der Datei1, welche ja als erster Parameter übergeben wird wechseln (dort alle Befehle ausführen), dort einen Ordner erstellen, wenn dieser nicht bereits existiert und anschließend die Datei1 in ebend jenes Verzeichnis/diesen Ordner verschieben. Und das unter allen Win-Versionen ab 95 und mit unterschiedlichsten Pfaden. Batch.bat und Datei1.txt sind dabei immer in unterschiedlichen Verzeichnissen/Ordnern. Mit Protokoll in ganz anderem Verzeichnis!
Tja also habe Folgendes:
Aufruf: Batch.bat "C:\.....\Datei1.*"
Bsp.: in Verzeichnis C:\BATS\ wird Batch.bat mit Batch.bat "C:\Texte\Datei1.txt" gestartet
Ziele: - in C:\Protokolle\Log.txt alle Ausgaben protokollieren
- alle Befehle (außer Protokoll) sollen in C:\Texte ausgeführt werden
- in C:\Texte soll (wenn nicht bereits vorhanden) ein Ordner "Test" erstellt werden
- Datei1.txt soll in den Ordner "Test" verschoben werden
Hindernisse: 1.) Die Verzeichnisse "BATS" "Texte" und "Protokolle" könnten wer-weiß-wo liegen, sogar
auf unterschiedlichen Laufwerken mit unterschiedlichen (unbekannten) Ordnerstrukturen...
auch könnte "Protokolle" nicht existieren.
2.) Es könnte sich um Windows 95, 98, 2000, nt, xp, me, vista handeln.
3.) Alles sollte möglichst innerhalb von Batch.bat ohne externe nicht-temporäre Dateien er-
ledigt werden.
Hoffe Ihr könnt mir helfen. (Mir, als Batchanfänger... )
Danke im Vorraus für Eure Mühen.
Gruß Adrian
Oh das Wichtigste hab ich vergessen:
Mein Ansatz:
:: bzw.
kommentiert:
bzw.
Erläuterungen, was ich will/Fehler:
Jaja, ich weiß das es so einfach nicht geht.
Er soll das Verzeichnis "Protokolle" selbst auf allen Laufwerken suchen und an LOGPATH übergeben.
Dann in die Pfadangabe wechseln die in %1 enthalten ist. (Hab schon herausgefunden, dass diese
in %CD% gespeichert ist [nur unter Vista?] und man mit %~f1 die Anführungszeichen wegläßt...).
Dann gucken ob der Ordner existiert und diesen wenn nicht erstellen um anschließend Datei1.txt
(aber wie kann ich das aus %1 ["C:\Texte\Datei1.txt"] bzw. %~f1 extrahieren?) nach Unterordner
Test zu verschieben.
Tja, so "%1 = %~f1-%CD%" einfach bekomme ich auch den Dateinamen nicht aus %1. Aber wie dann?
Ob das hier: "%0\.." überhaupt ein Gültiges Konstrukt ist, ist mir auch nicht klar, aber das einzige in die
Richtung Pfad der aufrufenden Batch rauskriegen, über das ich bei meiner vorangegangenen Recherche
gestolpert bin...
Bei "IF NOT EXIST" ließt man in der Hilfe von MS per "help if", dass ich damit prüfe ob eine Datei existiert.
Und ein Verzeichnis?
Ich denke ausführlicher kann ich nicht erklaeren was ich will. In diesem Sinne, verbleibe ich auf Hilfe hoffend
und mit nochmaligen freundlichen Grüßen...
Adrian
Aufruf: Batch.bat "C:\.....\Datei1.*"
Bsp.: in Verzeichnis C:\BATS\ wird Batch.bat mit Batch.bat "C:\Texte\Datei1.txt" gestartet
Ziele: - in C:\Protokolle\Log.txt alle Ausgaben protokollieren
- alle Befehle (außer Protokoll) sollen in C:\Texte ausgeführt werden
- in C:\Texte soll (wenn nicht bereits vorhanden) ein Ordner "Test" erstellt werden
- Datei1.txt soll in den Ordner "Test" verschoben werden
Hindernisse: 1.) Die Verzeichnisse "BATS" "Texte" und "Protokolle" könnten wer-weiß-wo liegen, sogar
auf unterschiedlichen Laufwerken mit unterschiedlichen (unbekannten) Ordnerstrukturen...
auch könnte "Protokolle" nicht existieren.
2.) Es könnte sich um Windows 95, 98, 2000, nt, xp, me, vista handeln.
3.) Alles sollte möglichst innerhalb von Batch.bat ohne externe nicht-temporäre Dateien er-
ledigt werden.
Hoffe Ihr könnt mir helfen. (Mir, als Batchanfänger... )
Danke im Vorraus für Eure Mühen.
Gruß Adrian
Oh das Wichtigste hab ich vergessen:
Mein Ansatz:
Set LOGPATH = C:\Protokolle\
CD C:\Texte>>%LOGPATH%Log.txt
IF NOT EXIST Test MD Test>>%LOGPATH%Log.txt
Move Datei1.txt Test/Datei1.txt>>%LOGPATH%Log.txt
FOR %%i IN (D E F G H I J K L M N O P Q R S T U V W X Y Z) DO IF EXIST %%i:\Protokolle LOGPATH=%%i:
IF (LOGPATH)==() MD Protokolle & SET LOGPATH = %0\../Protokolle
CD %CD%>>%LOGPATH%Log.txt
IF NOT EXIST Test MD Test>>%LOGPATH%Log.txt
%1 = %~f1-%CD%
Move %1 Test/%1>>%LOGPATH%Log.txt
TYPE %LOGPATH%Log.txt | MORE
PAUSE
EXIT
:: Pfadvariable fuer Protokoll (selber finden?)
Set LOGPATH = C:\Protokolle\
:: ins Verzeichnis Texte wechseln damit alle Befehle dort ausgeführt werden
:: (sonst wird md im Verzeichnis der .Bat ausgeführt -> C:\BATS\Test)
CD C:\Texte>>%LOGPATH%Log.txt
:: Test anlegen wenn noch nicht vorhanden
IF NOT EXIST Test MD Test>>%LOGPATH%Log.txt
:: Datei1 nach Test verschieben (Aber wie bekomm´ ich Datei1.txt aus %1?)
Move Datei1.txt Test/Datei1.txt>>%LOGPATH%Log.txt
:: In allen Laufwerken nach "Protokolle" suchen & ggf. an LOGPATH übergeben (Soll aber auch für Unterverzeichnisse.)
FOR %%i IN (D E F G H I J K L M N O P Q R S T U V W X Y Z) DO IF EXIST %%i:\Protokolle LOGPATH=%%i:
:: Wenn LOGPATH leer ist soll ein Ordner Protokolle in BATS erstellt & an LOGPATH übergeben werden
IF (LOGPATH)==() MD Protokolle & SET LOGPATH = %0\../Protokolle
:: (Ab jetzt soll alles in die LOG !!!)
:: Wechseln ins Verzeichnis der Datei in %1
CD %CD%>>%LOGPATH%Log.txt
:: Test anlegen, wenn nicht existent
IF NOT EXIST Test MD Test>>%LOGPATH%Log.txt
:: Dateiname.Dateiendung aus %1 filtern
%1 = %~f1-%CD%
:: Datei nach Unterordner Test verschieben
Move %1 Test/%1>>%LOGPATH%Log.txt
:: .Log seitenweise ausgeben und warten bis Benutzer gelesen, dann beenden
TYPE %LOGPATH%Log.txt | MORE
PAUSE
EXIT
Erläuterungen, was ich will/Fehler:
Jaja, ich weiß das es so einfach nicht geht.
Er soll das Verzeichnis "Protokolle" selbst auf allen Laufwerken suchen und an LOGPATH übergeben.
Dann in die Pfadangabe wechseln die in %1 enthalten ist. (Hab schon herausgefunden, dass diese
in %CD% gespeichert ist [nur unter Vista?] und man mit %~f1 die Anführungszeichen wegläßt...).
Dann gucken ob der Ordner existiert und diesen wenn nicht erstellen um anschließend Datei1.txt
(aber wie kann ich das aus %1 ["C:\Texte\Datei1.txt"] bzw. %~f1 extrahieren?) nach Unterordner
Test zu verschieben.
Tja, so "%1 = %~f1-%CD%" einfach bekomme ich auch den Dateinamen nicht aus %1. Aber wie dann?
Ob das hier: "%0\.." überhaupt ein Gültiges Konstrukt ist, ist mir auch nicht klar, aber das einzige in die
Richtung Pfad der aufrufenden Batch rauskriegen, über das ich bei meiner vorangegangenen Recherche
gestolpert bin...
Bei "IF NOT EXIST" ließt man in der Hilfe von MS per "help if", dass ich damit prüfe ob eine Datei existiert.
Und ein Verzeichnis?
Ich denke ausführlicher kann ich nicht erklaeren was ich will. In diesem Sinne, verbleibe ich auf Hilfe hoffend
und mit nochmaligen freundlichen Grüßen...
Adrian
Please also mark the comments that contributed to the solution of the article
Content-Key: 74648
Url: https://administrator.de/contentid/74648
Printed on: April 23, 2024 at 12:04 o'clock
23 Comments
Latest comment
Moin ghostdog21,
willkommen im Forum.
Erstmal danke für Deine sehr detaillierte Aufgabenbeschreibung.
Etwas in der Art ist leider nicht der allgemeine Standard - deshalb möchte ich es auch mal loben, wenn jemand sich Mühe bei der Frageformulierung gibt.
Dennoch habe ich zwei kleine Rückfragen:
Wo das Verzeichnis "BATS" liegt, ist eigentlich für den Fortbestand der Menschheit und auch alles andere vollkommen egal, dann da wird ja der Batch, den wir eventuell hier entwickeln aufgerufen.
Diesen Pfad "kennt" also der User. Somit bleiben die Fragen:
Grüße
Biber
willkommen im Forum.
Erstmal danke für Deine sehr detaillierte Aufgabenbeschreibung.
Etwas in der Art ist leider nicht der allgemeine Standard - deshalb möchte ich es auch mal loben, wenn jemand sich Mühe bei der Frageformulierung gibt.
Dennoch habe ich zwei kleine Rückfragen:
Die Verzeichnisse "BATS" "Texte" und "Protokolle" könnten wer-weiß-wo liegen
Ja, mag sein. Wo das Verzeichnis "Texte" liegt, ist aus dem ersten Parameter abzuleiten.Wo das Verzeichnis "BATS" liegt, ist eigentlich für den Fortbestand der Menschheit und auch alles andere vollkommen egal, dann da wird ja der Batch, den wir eventuell hier entwickeln aufgerufen.
Diesen Pfad "kennt" also der User. Somit bleiben die Fragen:
- woher kommt das Verzeichnis "Protokoll"? Bzw. die Info, wio das liegt/ggf. angelegt werden soll? Auf dem selben Laufwerk wie "Texte"? In einer parallelen Ebene? Oder in einem unterhalb des Verzeichnisses, in dem "Texte" liegt (Bsp: "D:\myAppz\Texte" und D:\myAppz\Protokoll")?
- wenn es für alle M$-Versionen seit Erfindung der Alufolie bis zu Vi$ta laufen soll: Dann ist es bei den neueren Versionen NICHT selbstverständlich, dass der/die UserIn irgendwo auf Laufwerk C:\ ein Verzeichnis auf Root-Ebene anlegen darf. Übliche wäre etwas entweder auf einem Laufwerk D: (wie Daten) oder aber im "%userprofile%"-Bereich. Hier könnte es also Rechte-Probleme (Ordner kann nicht angelegt werden) geben. Wie soll der Batch damit umgehen?
- Du schreibst: "keine nicht-temporären Dateien". Wäre trotzdem ein *.ini-Datei in Dein Konzept integrierbar? Damit diese o.b. Beliebigkeit (jeder Ordner kann überall sein) ein bisschen strukturiert wird?
Grüße
Biber
Moin ghostdog21,
hmmja, Du musstest ein bisschen warten, weil erstens heute ziemlich viel los war und zweitens Werder spielt. Ungünstiges Timing.
Ich will wenigstens mal den Anfang machen, weil ich irgendwie das Gefühl habe, wir müssen da noch ein bisschen sortieren...
Also, wo ich die Probleme sehe sind vor allem drei Punkte:
Aber jetzt was Konstruktives:
Okay, die Prüfung mit "IF Exist" war schon richtig
Win95/98: IF EXIST x:\verzeichnis\nul machwatt
W2000 ff: IF EXIST x:\verzeichnis machwatt
Schlechte Nachricht:
Vor W2000 (oder NT?) gab es nach meiner Erinnerung noch keine Zerlegung von Pfadangaben in Laufwerk/Pfad/Name/Extension (%~di, %~pi....).
Also wird es sogar schon schwierig, den übergebenen Parameter "C:\texte\datei1.txt" in Pfad und Dateiname zu trennen.
Wieso hast Du denn Grund zur Annahme, dass Dein Batch auf Win95/98-Rechnern gestartet werden könnte?
Grüße
Biber
hmmja, Du musstest ein bisschen warten, weil erstens heute ziemlich viel los war und zweitens Werder spielt. Ungünstiges Timing.
Ich will wenigstens mal den Anfang machen, weil ich irgendwie das Gefühl habe, wir müssen da noch ein bisschen sortieren...
Also, wo ich die Probleme sehe sind vor allem drei Punkte:
- Win 95/Win98 einerseits und alles diesseits von Win2000 andererseits haben einen so verschiedenenen Batch-Befehlsumfang, dass es mir fast schon sinnvoller erscheint, zwei verschiedene Batche zu schreiben. (Oder halt einen, der intern eine große Klammer "IF Win95/98 machdies else machwasrichtiges" hat).
- bei Win95/98-Batches bist Du weitestgehend auf ungetestete Skizzen angewiesen - es geht wahrscheinlich den meisten hier so wie mir, dass eventuell noch ein Rechner mit Win98 auf dem Dachboden steht, aber ob der noch bootet? Und ich kann mich an einzelne Szenen der Feuerzangenbowle wesentlich deutlicher erinnern als an Win95-Batchbefehle..
- OS-unabhängig suboptimal ist der Plan, irgendwo auf allen denkbaren Laufwerken (die heutzutage auch USB-Sticks und Cardreader und Digitalkameras sein können) ein Verzeichnis "Texte" und/oder "Protokolle" suchen zu wollen. Bis der Batch alle 288 GByte zu Ende durchsucht hat, bis dahin hat der toleranteste Benutzer den Batch beendet oder das Fenster geschlossen.
Aber jetzt was Konstruktives:
Oder eine Möglichkeit zur Abfrage ob ein Verzeichniss existiert (für Win95-Vista) würden weiterhelfen
Okay, die Prüfung mit "IF Exist" war schon richtig
Win95/98: IF EXIST x:\verzeichnis\nul machwatt
W2000 ff: IF EXIST x:\verzeichnis machwatt
Schlechte Nachricht:
Vor W2000 (oder NT?) gab es nach meiner Erinnerung noch keine Zerlegung von Pfadangaben in Laufwerk/Pfad/Name/Extension (%~di, %~pi....).
Also wird es sogar schon schwierig, den übergebenen Parameter "C:\texte\datei1.txt" in Pfad und Dateiname zu trennen.
Wieso hast Du denn Grund zur Annahme, dass Dein Batch auf Win95/98-Rechnern gestartet werden könnte?
Grüße
Biber
So,ghostdog21,
danke für Deine Geduld. Nun können wir auch mal irgendwo anfangen.
Aufruf: Batch.bat "C:\.....\Datei1.*"
Also, fangen wir klein an. Aber erstmal mit den W2000/XP-Varianten.
Mit einem Parameter %1, der aus Laufwerk, Pfad, Dateiname mit Endung besteht.
Dann "weiß" der Batch sein eigenes aktuelles Verzeichnis und das Verzeichnis, dass dem TEXTE-Verzeichnis entspricht.
Fangen wir an.
Soweit die erste grobe Skizze für einen Win2000ff-Batch.
Grüße
Biber
[Edit] Tippfehler fehlendes Anfü-Zeichen (in IF exist "%~dp1" ( pushD "%~dp1) s.u. [/Edit]
danke für Deine Geduld. Nun können wir auch mal irgendwo anfangen.
Aufruf: Batch.bat "C:\.....\Datei1.*"
Bsp.: in Verzeichnis C:\BATS\ wird Batch.bat mit Batch.bat "C:\Texte\Datei1.txt" gestartet
Okay.Ziele: - in C:\Protokolle\Log.txt alle Ausgaben protokollieren
Okay. Aber nur alle Ausgaben. Zum Beispiel der Befehl "md Texte" hat keine bei Erfolg.- alle Befehle (außer Protokoll) sollen in C:\Texte ausgeführt werden
Okay, warum nicht...- in C:\Texte soll (wenn nicht bereits vorhanden) ein Ordner "Test" erstellt werden
Datt schaff ich!- Datei1.txt soll in den Ordner "Test" verschoben werden
Na, wehe die ist nicht da...Also, fangen wir klein an. Aber erstmal mit den W2000/XP-Varianten.
Aufruf: Batch.bat "C:\.....\Datei1.*"
Das heißt, der Batch "UnserBatch.bat" im Verzeichnis d:\Xyz wird aufgerufen.Mit einem Parameter %1, der aus Laufwerk, Pfad, Dateiname mit Endung besteht.
Dann "weiß" der Batch sein eigenes aktuelles Verzeichnis und das Verzeichnis, dass dem TEXTE-Verzeichnis entspricht.
Fangen wir an.
@echo off & setlocal
REM Standard-Eröffnungsfloskel in neumodischen Bätchen
REM Parameter1 soll verabredungsgemäß sein "X:\SubDir\nochWatt\Texte\DateiXYZ.abc"
REM Dann wäre %1 = X:\SubDir\nochWatt\Texte\DateiXYZ.abc
REM Dann wäre %~dp1 = X:\SubDir\nochWatt\Texte <---- dahin sollen wir wechseln
REM Dann wäre %~nx1 = DateiXYZ.abc
Set "log=con:"
IF exist "%~dp1" ( pushD "%~dp1") else ( call :Fehler_Pfadgibtsnich "%~dp1") && goto :eof
REM wenn ich in dieser zeile bin, bin ich auch im TEXTE-Verzeichnis...
REM dann kann ich mal schauen, ob es parallel zu TEXTE auch PROTOKOLLE gibt.
If not exist ..\Protokolle md ..\Protokolle
Set "log=..\Protokolle\log.txt"
REM unterhalb TEXTE soll ein Ordner "Daten" unbedingt sein..
If not exist Daten (
call :Fehler_Pfadgibtsnich "%~dp1\Daten"
MD daten
If not exist Daten (echo %date% %time% "%~dp1\Daten" konnte nicht erstellt werden) & goto :eof
echo %Date% %time% "%~dp1\Daten" wurde erstellt>%log%
)
Move "%~1" daten\*.* /y
goto :eof
:Fehler_Pfadgibtsnich
echo %date% %time% Pfad nicht gefunden -Parameter 1 war [%1] >>%log%
Soweit die erste grobe Skizze für einen Win2000ff-Batch.
Grüße
Biber
[Edit] Tippfehler fehlendes Anfü-Zeichen (in IF exist "%~dp1" ( pushD "%~dp1) s.u. [/Edit]
Moin ghostdog21,
dann wollen wir mal den Nebel etwas lichten...
Das Hauptproblem war vermutlich ein fehlendes Anführungszeichen hier:
Zu Deinen Fragen:
Aber wie es immer im Leben ist - alle Fehler, die passieren, kann man/frau nicht aufschreiben.
Auch ich habe Fehler gemacht (wurde mir erzählt) als ich anderthalb Jahre alt war.
Diese konnte ich zu dieser Zeit gar nicht notieren.
Ähnlich geht es Dir bei Deiner Fehlerprotokollierung - Du kannst nicht in Deine Protokolldatei schreiben "Protokolldatei kann nicht angelegt werden."
Deshalb definiere ich am Anfang als Protokolldatei "con:", was bedeutet, dass alle Fehlermeldungen, alles was umgeleitet wird mit ">>%log%", in die Datei con: = Konsole= auf den Bildschirm geschrieben wird.
diese Buchstaben d,p,n,x stehen für Drive, Path, Name und eXtension und wenn ein Dateiname als erster Parameter (%1) übergeben wird, lassen sich mit %~d1 das Laufwerk dieser Datei, mit %~p1 der Pfad dieser Datei etc. einzeln zerlegt ermitteln.
Also bedeutet , wenn der Batch als Parameter 1 == %1 dieses bekommt:
---> also die Prüfung "wenn Verzeichnis "X:\SubDir\nochWatt\Texte" existiert...
Im ELSE-Fall (Verzeichnis existiert nicht) gibt es eine Fehlermeldung.
Wenn es aber existiert, dann soll mit PushD ""X:\SubDir\nochWatt\Texte" dorthin gewechselt werden.
Vorteile bei PushD/PopD (siehe Hilfe PopD /? bzw Pushd /?)
- es wird auch bei Bedarf das Laufwerk gewechselt (anders als bei "CD ..")
- und der Pfad, der bei Ausführung von PushD aktuell war kann später mit PopD wieder hergestellt werden.
So, bis hierhin erstmal bzw. bis morgen.
Grüße
Biber
dann wollen wir mal den Nebel etwas lichten...
Das Hauptproblem war vermutlich ein fehlendes Anführungszeichen hier:
IF exist "%~dp1" ( pushD "%~dp1") else...
nach dem ersten "%~dp1". ich habe es oben im Code ergänzt.Zu Deinen Fragen:
Das setlocal in Zeile 1 meint sicher, dass Pfadangaben nur lokal, temporär gespeichert werden, oder?
Jepp. Hat zwei Vorteile. Du hast hinterher keine definierten Variablen zu "löschen". Und Du kannst keine vorher bestehenden überschreiben (z.B..%path%, %username%...Aber was besagt Set "log=con:" ? Okay irgendeine Variable wird gesetzt, aber was wofür?
Die Variable %log% gibt den Namen der Logdatei/Protokolldatei an.Aber wie es immer im Leben ist - alle Fehler, die passieren, kann man/frau nicht aufschreiben.
Auch ich habe Fehler gemacht (wurde mir erzählt) als ich anderthalb Jahre alt war.
Diese konnte ich zu dieser Zeit gar nicht notieren.
Ähnlich geht es Dir bei Deiner Fehlerprotokollierung - Du kannst nicht in Deine Protokolldatei schreiben "Protokolldatei kann nicht angelegt werden."
Deshalb definiere ich am Anfang als Protokolldatei "con:", was bedeutet, dass alle Fehlermeldungen, alles was umgeleitet wird mit ">>%log%", in die Datei con: = Konsole= auf den Bildschirm geschrieben wird.
Wie Du darauf: "%~dp1" ( pushD "%~dp1) kommst [in der Zeile drunter] ist mir ein Rätsel.
Hmm, ich habe versucht, in den Zeilen darüber (im Batchschnipsel) ein Beispiel zu geben.diese Buchstaben d,p,n,x stehen für Drive, Path, Name und eXtension und wenn ein Dateiname als erster Parameter (%1) übergeben wird, lassen sich mit %~d1 das Laufwerk dieser Datei, mit %~p1 der Pfad dieser Datei etc. einzeln zerlegt ermitteln.
Also bedeutet , wenn der Batch als Parameter 1 == %1 dieses bekommt:
X:\SubDir\nochWatt\Texte\DateiXYZ.abc
--> IF exist "%~dp1"... == IF EXIST "X:\SubDir\nochWatt\Texte"---> also die Prüfung "wenn Verzeichnis "X:\SubDir\nochWatt\Texte" existiert...
Im ELSE-Fall (Verzeichnis existiert nicht) gibt es eine Fehlermeldung.
Wenn es aber existiert, dann soll mit PushD ""X:\SubDir\nochWatt\Texte" dorthin gewechselt werden.
Vorteile bei PushD/PopD (siehe Hilfe PopD /? bzw Pushd /?)
- es wird auch bei Bedarf das Laufwerk gewechselt (anders als bei "CD ..")
- und der Pfad, der bei Ausführung von PushD aktuell war kann später mit PopD wieder hergestellt werden.
So, bis hierhin erstmal bzw. bis morgen.
Grüße
Biber
Moin ghostdog21,
...okay, die Detailfehler in der oben hingepfuschten Skizze würde ich jeweils auf eine der folgenden Arten testen (alles bezogen auf das MOVE-Problem):
Beispiel:
STATT: Move "%~1" daten\*.* /y
NEU: ECHO Move "%~1" daten\*.* /y
Pause
Grüße
Biber
...okay, die Detailfehler in der oben hingepfuschten Skizze würde ich jeweils auf eine der folgenden Arten testen (alles bezogen auf das MOVE-Problem):
- diese Zeile am CMD-Prompt testen; für Variablen die Inhalte einsetzen
- dieser Zeile um Batch ein "Echo " voranstellen und in die Folgezeile ein "Pause". Schauen, was ausgeführt werden würde und ggf. mit CRTL-C abbrechen.
Beispiel:
STATT: Move "%~1" daten\*.* /y
NEU: ECHO Move "%~1" daten\*.* /y
Pause
Grüße
Biber
Moin ghostdog21,
im oberen Beispiel-Batch hast Du hier einen (Copy & Paste-) Fehler
Der zwar in eine Datei "werden" schreibt, aber sonst nichts Schlimmes.
Wo ich die falsche Syntax im Kopf und auch im Kommentar gehabt habe ist beim MOVE-Befehl.
FALSCH: --->>>>>> Move "%~1" daten\*.* /y
Nicht so falsch: ----> Move "%~1" daten /y
...Also ohne Wildcards.
Eventuell war es das schon.
Grüße
Biber
im oberen Beispiel-Batch hast Du hier einen (Copy & Paste-) Fehler
If not exist Daten (echo %date% %time% "%~dp1\Daten" konnte nicht erstellt >> werden) & goto :eof
Der zwar in eine Datei "werden" schreibt, aber sonst nichts Schlimmes.
Wo ich die falsche Syntax im Kopf und auch im Kommentar gehabt habe ist beim MOVE-Befehl.
FALSCH: --->>>>>> Move "%~1" daten\*.* /y
Nicht so falsch: ----> Move "%~1" daten /y
...Also ohne Wildcards.
Eventuell war es das schon.
Grüße
Biber
Moin ghostdog21,
Da steht:
Nochmal für Genießer klassischer Dialoge:
..okay, die sitzen am längeren Hebel....noch...*grummmbff*
Die anderen Fragen sind in Anbetracht dieses Sachverhalts eher zu vernachlässigen..
Aber gut:
Ist dann relevant, wenn Du zwei Variablen verketten willst oder vergleichen.
%log1% ist z.B. beim Vergleich UNgleich %log2%. Denke, ist klar.
Die Schreibweise %~1 bedeutet: den Parameter 1 OHNE evtl. vorhandene Leerzeichen.
Weil ich diese ja in dem Beispiel selbst umschließen lasse (ich arbeite lieber mit "%~1 "; da weiß ich, es sind genau ein Paar Anfü-Zeichen drumherum.
Der übergebene Parameter1 kann ja sein
%1 == c:\test\bla.txt
-oder aber ein Parameter in Anfü-Zeichen
%1 == "C:\Dokumente und Einstellungen\Neo\Pren.txt"
So, Feierabend für heute.
Ebenfalls schönen Nackiklaus oder so was
Biber
Ich weiß nicht warum, aber ..
Weil ich ein ganz schlauer Fuchs bin und zu gewieft, um hin und wieder mal den Text von "Move /?" am Cmd-Prompt zu lesen... *grmff*Da steht:
>move /?
Verschiebt Dateien und benennt Dateien und Verzeichnisse um.
Um eine oder mehrere Dateien zu verschieben:
MOVE [/Y| /-Y] [Laufwerk:][Pfad]Datei1[,...] Ziel
Um ein Verzeichnis umzubenennen:
MOVE [/Y| /-Y] [Laufwerk:][Pfad]Verz1 Verz2
....
M$ sagt, es heißt "Move /y quelleAlt zielNeu".
Biber sagt, es geht auch "Move quelleAlt zielNeu /y".
M$ sagt: "Syntaxfehler."
Biber sagt, es geht auch "Move quelleAlt zielNeu /y".
M$ sagt: "Syntaxfehler."
..okay, die sitzen am längeren Hebel....noch...*grummmbff*
Die anderen Fragen sind in Anbetracht dieses Sachverhalts eher zu vernachlässigen..
Aber gut:
set "log1=..\protokolle\log.txt" ---->führt zu einer Variablen %log1% =[..\protokolle\log.txt]
set log2="..\protokolle\log.txt" ---->führt zu einer Variablen %log2% =["..\protokolle\log.txt"]
Ist dann relevant, wenn Du zwei Variablen verketten willst oder vergleichen.
%log1% ist z.B. beim Vergleich UNgleich %log2%. Denke, ist klar.
Die Schreibweise %~1 bedeutet: den Parameter 1 OHNE evtl. vorhandene Leerzeichen.
Weil ich diese ja in dem Beispiel selbst umschließen lasse (ich arbeite lieber mit "%~1 "; da weiß ich, es sind genau ein Paar Anfü-Zeichen drumherum.
Der übergebene Parameter1 kann ja sein
%1 == c:\test\bla.txt
-oder aber ein Parameter in Anfü-Zeichen
%1 == "C:\Dokumente und Einstellungen\Neo\Pren.txt"
So, Feierabend für heute.
Ebenfalls schönen Nackiklaus oder so was
Biber
@Biber
Und dann steht da sogar auch noch:
Grüße
bastla
Und dann steht da sogar auch noch:
Die Option /Y ... Standardmäßig
müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.
Grüße
bastla
@bastla
Du kennst Dich doch aus, Du weißt das bestimmt:
Heißt es "Salz in die Wunde reiben" oder "Salz auf die Wunde kippen"?
Oder gar "mit Salz wundscheuern"??
Danke schön!
Das war die zweit-elaborierteste Version eines lapidaren RTFM!, die ich je gesehen habe.
Dir auch einen schönen Abend
Biber
Du kennst Dich doch aus, Du weißt das bestimmt:
Heißt es "Salz in die Wunde reiben" oder "Salz auf die Wunde kippen"?
Oder gar "mit Salz wundscheuern"??
Danke schön!
Das war die zweit-elaborierteste Version eines lapidaren RTFM!, die ich je gesehen habe.
Dir auch einen schönen Abend
Biber
Moin ghostdog21,
also, so ganz kann ich jetzt nicht folgen, ob die Datei nun verschoben oder gelöscht oder ersetzt werden soll... kann aber auch daran liegen, dass ich so viel lachen muss...
Egal, gehen würde alles.
Wenn eine Datei gelöscht werden soll UND der genaue Name angegeben wird, dann brauchst Du eh kein "y" oder "J" oder sonstwas. Da gibt es keine Rückfrage.
Wenn gelöscht werden soll ohne genauen Namen, also mit Wildcards, dann kann die Rückfrage mit "del /y" unterdrückt werden.
Dieses wiederverwendbare "y" in einer Datei namens "y" brauchen wir also nicht unbedingt.
Grüße
Biber
also, so ganz kann ich jetzt nicht folgen, ob die Datei nun verschoben oder gelöscht oder ersetzt werden soll... kann aber auch daran liegen, dass ich so viel lachen muss...
Egal, gehen würde alles.
Wenn eine Datei gelöscht werden soll UND der genaue Name angegeben wird, dann brauchst Du eh kein "y" oder "J" oder sonstwas. Da gibt es keine Rückfrage.
Wenn gelöscht werden soll ohne genauen Namen, also mit Wildcards, dann kann die Rückfrage mit "del /y" unterdrückt werden.
Dieses wiederverwendbare "y" in einer Datei namens "y" brauchen wir also nicht unbedingt.
Grüße
Biber