Unerwartete Ergebnisse mit Kopierbefehl und Excel-Dateien

484
roger21

Beim Ausführen des Befehls "Kopieren" aus einer Windows-Batchdatei ist mir etwas Ungewöhnliches aufgefallen, und ich habe mich gefragt, ob dies bereits jemand gefunden hat und die Ursache erklären kann.

Ich habe eine Zeile in einer Batch-Datei, die eine Excel-Datei von Ort A nach Ort B kopiert und die Datei ebenfalls umbenennt. Zum Beispiel:

Copy \\server\share\folder\locationA\file_*.xlsx \\server\share\folder\locationB\file.xlsx /y 

Die Kopie sieht so aus, als wäre sie in Ordnung, da das Excel in Position B vorhanden ist. Wenn ich jedoch die Datei öffne, erhalte ich eine Fehlermeldung, die Folgendes angibt:

"Excel kann die Datei nicht öffnen ... weil das Dateiformat oder die Dateierweiterung nicht gültig ist. Stellen Sie sicher, dass die Datei nicht beschädigt ist und dass die Dateierweiterung dem Format der Datei entspricht."

Ich habe einige Tests mit der obigen Befehlszeile ausgeführt und festgestellt, dass dieses Problem nur auftritt, wenn ich in Teil A einen Platzhalter im Dateinamen verwende. Die Datei wird beispielsweise kopiert und ich kann sie mit diesem Befehl problemlos öffnen:

Copy \\server\share\folder\locationA\file_LongName.xlsx \\server\share\folder\locationB\file.xlsx /y 

Mir ist klar, dass es viele Möglichkeiten gibt, dies zu beheben, aber ich interessiere mich nicht für eine Lösung, ich interessiere mich für eine Erklärung. Meine Frage ist, warum das passiert.

3

1 Antwort auf die Frage

3
Worthwelle

Der Grund für dieses Problem besteht darin, dass das Platzhaltermuster den COPYBefehl in den Verkettungsmodus wechselt, der für Nur-Text-ASCII-Dateien konzipiert ist. Im ASCII-Modus sehen einige Daten in Binärdateien wie ein "Ende der Datei" aus.


.XLSX-Dateien in Excel sind im Wesentlichen Zip-Archive mit einer anderen Erweiterung, und Zip-Archive sind Binärdateien und keine ASCII-Dateien. Der COPYBefehl behandelt diese Binärdatei als ASCII-Datei und versucht, den Inhalt mit nichts zu verketten.

Man könnte meinen, eine Verkettung einer Datei mit nichts würde Ihnen die gleiche Datei geben, mit der Sie angefangen haben, aber in diesem Fall nicht.

Der COPYBefehl verarbeitet eine Datei nur so lange, bis ein EOF-Zeichen erreicht wird . Wenn dieses Zeichen erreicht ist, wird die nächste Datei angezeigt. (In diesem Fall wird die Verarbeitung vollständig abgebrochen.)

Ihre binären Excel-Dateien enthalten Daten, die bei der Konvertierung in ASCII EOF-Zeichen darstellen. Daher endet die Verkettung der Datei früher als erwartet.

Um dies zu veranschaulichen, habe ich Ihren COPYBefehl verwendet, um eine 7zip-Datei mit einer leeren Excel-Datei zu verketten (ich habe sie gerade in file_1.xlsxund umbenannt file_2.xlsx). Ich habe die 7zip-Datei und die Ausgabedatei in Notepad ++ geöffnet und den Inhalt mit WinMerge verglichen.

WinMerge comparison

Wie Sie im Bild sehen können, sind die beiden Dateien bis zum (1A)Zeichen identisch .

Als nächstes habe ich zwei reine Textdateien verkettet, die einwandfrei funktionierten. Nachdem ich dieses (1A)Zeichen (das in Notepad ++ als angezeigt wird (sub)) in eine der Textdateien eingefügt hat, konnte ich jedoch bestätigen, dass der COPYBefehl genau an diesem Punkt angehalten und zur nächsten Datei verschoben wurde.

Concatenation in Notepad++

Wow, was für eine gründliche Antwort. Vielen Dank dafür! roger21 vor 5 Jahren 0