2017-12-27 11 views
0

Ich habe nach einer Lösung für mein Problem gesucht, aber es ist seltsam und ich kann nicht genau herausfinden, wo es falsch läuft.Batch-Datei funktioniert nicht richtig, es sei denn, ich beobachte es

Ich habe eine Batch-Datei, die ziemlich einfach scheint. In einem Verzeichnis, das zwei Dateien enthält, soll es eins löschen, das andere kopieren und dann in das umbenennen, was die gerade gelöschte Datei genannt hat. Bis auf die Umbenennung scheint alles richtig zu funktionieren. Es scheint fast, dass das Skript zweimal ausgeführt wird, aber ich kann keinen tatsächlichen Beweis dafür finden. Siehe unten:

SET filepath="\\server-name\directory with a space\" 
SET oldFile=filename.csv 
SET curFile=filename_*.csv 

REM ===Delete current filename.csv=== 
IF EXIST %filepath%%oldFile% DEL %filepath%%oldFile% 

REM ===Copy all versions of .csv files that begin with filename_ to the Archive folder=== 
IF EXIST %filepath%%curFile% COPY /y %filepath%%curFile% %filepath%%Archive 

REM ===Rename the .csv file beginning with filename_ to filename.csv=== 
IF EXIST %filepath%%curFile% RENAME %filepath%%curFile% %oldFile% 

Wenn ich dies manuell ausführen, scheint es gut zu funktionieren. Wenn ich es jedoch von einer geplanten Task aufrufen lasse, scheint es zweimal ausgeführt zu werden ... das heißt, es löscht die Datei filename.csv, kopiert den Dateinamen _ *. Csv an die richtige Stelle, scheint dann aber die zweite Datei zu löschen anstatt es umzubenennen.

Wie gesagt, ich bin wirklich unklar, was eigentlich gemacht wird. Ich habe versucht, die Ergebnisse in einer Ausgabedatei zu protokollieren, aber darin ist nichts hilfreich.

Kann jemand etwas sehen, das ich vermisse?

Vielen Dank im Voraus.

+0

Zum Testen fügen Sie ein 'echo% Dateipfad %% oldFile%' - es gibt '" \\ Server-Name \ Verzeichnis mit einem Leerzeichen \ "Dateiname.csv" - wahrscheinlich nicht das, was Sie wollten. Antwort von Magoo zeigt die korrekte Zitatsyntax für 'set'. – zett42

+0

Vielen Dank bis jetzt zett42, lit, und Magoo für die Hilfe bei den Anführungszeichen-Positionen und besseren Praktiken. Ich denke, das hilft sehr, auch wenn es am Ende das Problem nicht vollständig löst. :) – Night1505

Antwort

0

Ich habe endlich die Lösung dafür gefunden. Es stellte sich heraus, dass eine Kopie der Aufgabe auf einem älteren Server ausgeführt wurde, von dem unsere neue Umgebung migriert wurde. Es lief genau zur gleichen Zeit wie die auf dem neuen Server, weshalb es auf jeden Fall einwandfrei funktionieren würde, wenn ich versuchte, es vor oder nach dem Zeitpunkt auszuführen, an dem die Aufgabe ausgeführt wurde. Durch Deaktivieren der alten Version der Aufgabe wurde das Problem behoben.

Vielen Dank an diejenigen, die Feedback und Anregungen zu meinen Befehlen gegeben haben!

1

Untersuchen

IF EXIST %filepath%%curFile% COPY /y %filepath%%curFile% %filepath%%Archive 

Beachten Sie, dass archive ein % führt zu haben scheint - ist dies bedeutete ein Verzeichnis „Archiv“ zu sein oder ist archive Satz zu etwas, was du uns nicht zeigen, und deshalb sollte es sein ...%filepath%%Archive%

die Folge der (? fehlt/Streu %) ist, dass die Datei in eine Datei archive oder in ein Verzeichnis archive Namen genannt kopiert werden würde, wenn das Verzeichnis bereits vorhanden ist.

Persönlich würde ich

SET "filepath=\\server-name\directory with a space" 

wo die Anführungszeichen die Zeichenfolge begrenzen (also keine Streu abschließende Leerzeichen zugeordnet auf die Variable) und dann konstruieren, um die Quell-/Zielnamen „% var1 zugewiesen werden % \% var2% "was sicherstellt, dass kein Doppel-" erscheint und das Verzeichnis offensichtlich ist (aber das ist eine Frage des Stils).

+0

Es ist ein Unterordner. Zum Beispiel \\ Servername \ Verzeichnis mit einem Leerzeichen \ Archiv. Ich sehe, dass streunende "%" Zeichen Sie entdeckt (gutes Auge!), Aber es tut die Kopie richtig. Was scheint zu geschehen ist, dass es die alte Datei löscht (wenn sie existiert), kopiert die aktuelle Datei in den Archiv-Unterordner, aber dann, anstatt es umzubenennen, scheint es auch aus dem aktuellen Ordner zu löschen. Das ist ein Teil dessen, was mich so verwirrt hat. – Night1505

+0

Nun, es scheint für mich zu funktionieren mit meiner Simulation Ihrer Situation. Sind Sie sicher, dass 'oldfile' nach dem' rename' nicht im Verzeichnis 'filepath' existiert? Vielleicht kann 'dir filename * .csv' sowohl vor als auch nach der Zeile' if exist ... rename ... 'einen Hinweis liefern? Ich habe versucht mit mehreren 'filename _ *. Csv'-Dateien, die die entsprechenden" doppelte Dateiname oder nicht gefunden "Nachrichten ergab, aber immer noch 'filename.csv' in Residenz. Sind Sie sicher, dass Sie die Fehlermeldungen nicht einfach falsch interpretieren? – Magoo

+0

Ja, wenn ich es in Ruhe lasse und es von der Aufgabe ausführen lasse, habe ich keinen Dateinamen.csv. Zum Beispiel: Angenommen, ich habe 'filename.csv' im Ordner" Basisordner "vom Vortag. Also ist die alte Datei '\\ Server \ Base Folder \ filename.csv'. Heute wird eine neue Datei namens Dateiname_2017.12.28.11.15.csv erstellt. Beide befinden sich im selben Ordner. Wenn ich das Skript selbst laufen lasse, finde ich die Datei 'filename_2017.12.28.11.15.csv' in \\ Server \ Base Folder \ Archive und überhaupt keine Dateien im Basisordner. Ich kann dann die Datei aus dem Archiv kopieren, die Aufgabe manuell erneut ausführen und es läuft perfekt. – Night1505

1

Es ist eine bewährte Methode, Pfade anzugeben. In diesem Fall, wo ein Raum beteiligt ist, ist es eine Anforderung. Es ist einfacher, das Zitat aus der Variablendefinition wegzulassen und sie dort bereitzustellen, wo sie benötigt wird, wenn die Variable verwendet wird.

Nach meiner Erfahrung ist es am besten, das Verzeichnis am Ende eines Pfades ohne den nachfolgenden Backslash zu verlassen. Außerdem sollte ein UNC-Pfad einen Freigabenamen haben.

SET "filepath=\\server-name\sharename\directory with a space" 
IF EXIST "%filepath%\%oldFile%" (DEL "%filepath%\%oldFile%") 
Verwandte Themen