BATCH-Datei Befehle: "@ECHO OFF", "REM", "ECHO" usw. -- FUNKTIONIEREN NICHT
Ich schreibe gerade ein Backup-Script per Batch Datei um einige Dateien in einem rutsch in die Cloud zu sichern.
Das Script Ansich ist überhaupt kein Problem, die Batch Sprache verstehe ich super und seit ca. 20 Jahren. Offensichtlich habe ich da ein anderes Problem. Vielleicht könnt ihr es mal bei Euch testen und mir sagen was bei Euch passiert?
Wenn ich also eine Batch Datei schreibe, möchte ich z.B. nicht dass die Befehle(Befehlszeile) angezeigt werden, deswegen beginne ich meine Batch-Datei mit einem:
@ECHO OFF
Dann kommt der Rest vom Script usw.
Ich bekomme allerdings eine Fehlermeldung bei der Stapelverarbeitung, bevor der erste Befehl aufgeführt wird.
Beispiel:
@echo off
REM Dieses ist ein Test um zu zeigen das etwas nicht stimmt.
ECHO Dieses ist ein Test.
pause
Wenn ich dieses kleine, Script(Batchdatei) ausführe kommt folgende Fehlermeldung:
Das System kann den angegebenen Pfad nicht finden.
Drücken Sie eine beliebige Taste . . .
Sowohl beim Doppelklick auf die Batchdatei selbst, als auch bei der Eingabe in der CMD Befehlszeile.
Interessanter Weise wird weder das @ECHO OFF noch das REM oder Echo korrekt interpretiert. Ich habe eine vermutung, dass die Batch als falsches Format abgespeichert wurde.
Ich Habe verschiedene Editoren benutzt. Notepad in der Standart Einstellung, Notepad ++ nehme ich Standardmäßig.
Ich habe die Kodierungen überprüft also ANSI oder UTF8.
Wenn ich im CMD Befehlszeilenfenster den Befehl "@ECHO OFF" oder "REM" oder "ECHO mit BLABLA" eingebe, funktionieren sie; also außerhalb der Batch Datei.
Ich habe keine Verknüpfung angelegt oder falsche Parameter angegeben, ich starte die Batch direkt aus einem Verzeichnis Namens: D:\Backup. Es sind keine Sonderzeichen enthalten, weder im Namen noch in irgendwelchen Verzeichnissen oder sonstwas.
Also meine Vermutungen sind :
--Falsches Format der Batch Datei <- Warum auch immer --Virus oder Schadprogramm, welches versucht über die Kommandozeile Schadcode einzuschleusen.
Also letztes hänge ich mal den Anfang meines Batch-Scripts für das Backup mit an, damit ihr mal sehen könnt, was mir da angezeigt wird.
@echo off
REM ################################################
REM # Backup und Sicherungsscript #
REM # #
REM # #
REM ################################################
pause
Ich habe am Ende eine pause mit eingefügt, damit die Stapelverarbeitung anhält.
Das ist die Ausgabe der Datei im Prompt:
D:\Backup>´╗┐@echo off
Der Befehl "´╗┐@echo off" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Mein System:
AMD 3300T 8GB ATI HD 7850 usw, Windows 7 Deutsch/Home Premium - Original
Benutze Software: Windows 7, Notepad++, Notepad(Windows 7)
Ich hoffe ich konnte genug Informationen liefern, dass mir jemand helfen kann.
Vielen Dank grüße aus HH
3 Antworten
Da ist wahrscheinlich ein Editor "schuld", der das Script in UTF-16 oder UTF-8 speichert und ein "Byte Order Mark" vorne dranhängt.
http://en.wikipedia.org/wiki/Byte_order_mark
Jedes NORMALE Textverarbeitungs-Programm, das UTF-8 und UTF-16 zu verarbeiten imstande ist, erkennt dieses als solches und verarbeitet das entsprechend (also zeigt es schlicht nicht an).
Die Kommandozeile scheint davon nichts zu wissen.
=============
Lösung: Den Editor explizit anweisen, den Text als reinen ASCII-Text zu speichern!
Mal sehn... Ich versuche mal, den Fall nachzustellen...
Notepad++ also ist der Verbrecher...
Bei mir steht dessen "Kodierung" (entsprechender Menüpunkt) standardmäßig auf "ANSI". Ich stelle das mal auf "UTF-8" (das zweite, nicht das "UTF-8 ohne BOM")...
OK: Verhalten exakt wie von Dir beschrieben.
Jetzt zum Korrigieren: Es reicht bereits, im Menü "Kodierung" auf "UTF-8 (ohne BOM)" umzustellen und zu speichern.
Genau das habe ich auch schon mehrfach versucht. Die Dateien scheinen jetzt im richtigen Format zu sein.
Nach der vorherigen Anleitung habe ich jetzt.
- Notepad++ aufgemacht
- Batch Datei geladen
- Format überprüft, letzte Einstellung war Ansi
- Format einmal auf UTF-8 (ohne BOM) gestellt
- Datei nur gespeichert
- Batch Datei ausgeführt
Diesen Screenshot habe ich vom Ergebnis gemacht:
http://img856.imageshack.us/img856/2120/k4x7.jpg
Die erste Zeile, "Das System kann den angegebenen Pfad nicht finden", kann ich nicht erklären. Die kommt aus dem Nichts.
Die zweite Zeile ist das erste "Echo", das in meinem Script korrekt ausgeführt wird. Die dritte und vierte Zeile ist irrelevant. Dort wird nur die alte Backup.old gelöscht und backup.log in backup.old umbenannt. Da momentan keine der Dateien existiert. ---irrelevant.
In der 5. Zeile kann man klar sehen, dass die Datei im richtigen Format abgespeichert wurde, da die Umlaute nicht richtig interpretiert werden.
In diesem Moment habe ich etwas ausprobiert. Ich habe jetzt alle Umlaute in "ae", "ue" usw. umgewandelt und die Datei im MSDOS Ascii Format abgespeichert. Habe die backup.bat aus der Kommandozeile gestartet und siehe da - KEIN FEHLER -
Allerdings, nur in der Kommandozeile . Wenn ich die backup.bat aus Windows/Explorer starte, kommt immer noch der Fehler. Zumindest der erste.
Ich kann also den Fehler verschwinden lassen, ihn jedoch nicht beheben. Durch gezieltes "CLS" in der Batch-Datei kann ich diese Meldungen verschwinden lassen. Durch tricksen im Notepad++, kann ich den ersten Fehler verschwinden lassen, vorrausgesetzt ich starte das Script aus der Kommandokonsole (CMD).
Doch behoben ist das Problem "bei Doppelklick" noch nicht.
Hier noch einmal die ersten Zeilen des Script, das den Screenshot erzeugt hat.
@ECHO OFF
REM SICHERUNG
REM ################################################
REM # Backup und Sicherungsscript #
REM # #
REM # #
REM ################################################
ECHO SICHERUNGSSCRIPT v0.5
del D:\Scripts\backup.old
ren D:\Scripts\backup.log backup.old
@Echo Soll die Datensicherung durchgeführt werden
@Echo bei nein [STRG+C] drücken!
pause
Vielen Dank ein weiteres mal im Vorraus.
OK, es geht doch in die richtige Richtung!
Beim Start mit Doppelklick findet folgender Prozeß im System statt:
- Nachschlag in der Registry nach einem Eintrag unter HKEY______CLASSES__ROOT, ob dort ein Element ".bat" definiert ist
- Wenn ja: Weiterleitung über den definierten "Default-Wert" dieses Elements zum nächsten Eintrag unter demselben Zweig der Registry (auf meinem individuell zurechtgebogenen System geht das dann nach "batfile", bei Ihnen heißt die Zielstelle vielleicht etwas anders)
- In jenem weitergeleiteten Element: Dort gibt es ein Unterelement namens "shell", dort drunter "open", dort drunter "command"...
- Was im letzteren Unterelement (command) als "Default-Wert" definiert ist, wird ausgeführt.
Dieses letzte Element ist die tatsächlich beim Doppelklick auf Ihre Batchdatei ausgeführte Aktion in Ihrem System.
Was dort definiert ist, muß sich in der Ausführung vom Aufruf Ihrer Batchdatei aus einer geöffneten Konsole heraus unterscheiden.
Worin genau dieser Unterschied besteht, kann man aber erst dann sagen, wenn man die ganzen Definitionen vor der Nase hat. Sie könnte den Registry-Eintrag vom "command" "exportieren" und dann hier posten...
Die Unterstriche im Namen des Registry-Schlüssels sind einem Versuch geschuldet, dem verrückten Forums-Textverwurstler hier beizubringen, daß der meine Unterstriche gefälligst nicht in kursiv und/oder bold umzusetzen hat, allerdings wie zu sehen mit mäßigem Erfolg. Es muß aber irgendwie gehen, denn ich habe schon Beiträge hier im Forum gesehen, wo Leute im laufenden Text solche Unterstriche korrekt eingebaut hatten.
Jedenfalls ist das, was im Vorschau-Fenster des Javascript-Editors angezeigt wird, mitnichten das, was nach der serverseitigen Filterung im Forumstext erscheint. Aber trotzdem sind die Unterstriche schon mal überhaupt da.
Es soll natürlich jeweils nur EINER da stehen, gelle?!
Dankeschön für die, wiedermal schnelle Antwort.
Ich habe Ihren Rat befolgt und folgenden Schlüssel der Registry exportiert. Ich hoffe ich konnte mehr Informationen liefern.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\batfile]
@="Windows Batch File"
"EditFlags"=hex:30,04,00,00
"FriendlyTypeName"=hex(2):40,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,\
00,6f,00,6f,00,74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,\
32,00,5c,00,61,00,63,00,70,00,70,00,61,00,67,00,65,00,2e,00,64,00,6c,00,6c,\
00,2c,00,2d,00,36,00,30,00,30,00,32,00,00,00
[HKEY_CLASSES_ROOT\batfile\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,69,00,6d,00,\
61,00,67,00,65,00,72,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,36,\
00,38,00,00,00
[HKEY_CLASSES_ROOT\batfile\shell]
[HKEY_CLASSES_ROOT\batfile\shell\edit]
[HKEY_CLASSES_ROOT\batfile\shell\edit\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
00
[HKEY_CLASSES_ROOT\batfile\shell\open]
"EditFlags"=hex:00,00,00,00
[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="\"%1\" %*"
[HKEY_CLASSES_ROOT\batfile\shell\print]
[HKEY_CLASSES_ROOT\batfile\shell\print\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,2f,00,70,00,20,\
00,25,00,31,00,00,00
[HKEY_CLASSES_ROOT\batfile\shell\runas]
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\batfile\shell\runas\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6d,00,\
64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,43,00,20,00,22,00,25,00,31,00,22,\
00,20,00,25,00,2a,00,00,00
[HKEY_CLASSES_ROOT\batfile\shell\runasuser]
@="@shell32.dll,-50944"
"Extended"=""
"SuppressionPolicyEx"="{F211AA05-D4DF-4370-A2A0-9F19C09756A7}"
[HKEY_CLASSES_ROOT\batfile\shell\runasuser\command]
"DelegateExecute"="{ea72d00e-4960-42fa-ba92-7792a7944c1d}"
[HKEY_CLASSES_ROOT\batfile\ShellEx]
[HKEY_CLASSES_ROOT\batfile\ShellEx\ContextMenuHandlers]
@="Compatibility"
[HKEY_CLASSES_ROOT\batfile\ShellEx\ContextMenuHandlers\Compatibility]
@="{1d27f844-3a1f-4410-85ac-14651078412d}"
[HKEY_CLASSES_ROOT\batfile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"
[HKEY_CLASSES_ROOT\batfile\ShellEx\PropertySheetHandlers]
[HKEY_CLASSES_ROOT\batfile\ShellEx\PropertySheetHandlers\ShimLayer Property Page]
@="{513D916F-2A8E-4F51-AEAB-0CBC76FB1AF8}"
[HKEY_CLASSES_ROOT\batfile\ShellEx\{8895b1c6-b41f-4c1c- a562-0d564250836f}]
@="{1531d583-8375-4d3f-b5fb-d23bbd169f22}"
Was mich an dieser Sache ein bisschen stört ist, alle anderen Kommando's z.B. Print oder Edit sind mit einem "%1" angegeben. "%1" steht in diesem Fall für den Parameter (Namen und Pfad der Batchdatei). Spricht, wenn ich RECHTSKLICK auf eine Batchdatei mache und klicke auf "Drucken", wird der Inhalt der Batchdatei (%1) ausgedruckt.
JEDOCH
Bei "run" und "run as" und "open", steht "%1" und %* dahinter. Hat das evtl. etwas zu bedeuten?
Ich wollte dieses abklären, bevor ich anfange in der Registry rumzufummeln.
Ja, das...
[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="\"%1\" %*"
...ist hier das relevante. Gibt mir aber keinen Anhaltspunkt zum oben geschilderten Problem, weil das völlig OK so ist. Da komme ich mit Ferndiagnose erstmal nicht weiter.
"%1" steht für das erste Argument der ausgelösten Aktion. Wenn man im Dateimanager auf eine Datei doppelklickt, ist dieses erste Argument der ausgelösten Aktion der Dateiname.
- Wenn's zum Beispiel zum Drucken geht, wird zur weiteren Ausführung eine Anwendung gestartet, die drucken kann, und dieser der Dateiname der zu druckenden Datei als Argument übergeben.
- Wenn's zum Ausführen gehen soll, wird der auszuführende Dateiname "direkt selbst" ausgeführt. Obwohl das tatsächlich nicht ganz so direkt gemeint ist: Vom Betriebssystem ist aber bereits ein interner Automatismus für alle Dateien vorgesehen, die als "ausführbar" definiert sind: Für die wird automatisch vom Betriebssystem eine passende Ausführ-Umgebung bereitgestellt und das Programm in dieser gestartet. Für Batch-Dateien bedeutet das, daß das Betriebssystem implizit eine Kommando-Shell (alias Dos-Box) startet und derselben im Startbefehl einen Parameter mitgibt, der den Namen der Batchdatei enthält und deren Ausführung anfordert.
===========
Weil das alles bereits implizit unter der Haube vordefiniert ist, wird es in der Registry nicht extra vermerkt. Das hält aber niemanden davon ab, es in der Registry trotzdem explizit hinschreiben zu dürfen. Etwa wenn man an seinem Systemverhalten noch einige Modifikationen einstellen möchte.
===========
Fazit: An Ihrem System sieht das aber alles vollkommen OK aus. Eigentlich dürfte es keine Probleme mit dem Ausführen von Batchdateien geben. Und das Problem mit dem "BOM" hat sich ja auch schon erledigt. Für weiterführendes müßte man mal vor Ort einen Blick auf Ihre ganz konkreten Batch-Dateien und deren Umgebung werfen. Jedenfalls kann ich aus den bisherigen Angaben bei mir keinen Fall nachstellen, der das berichtete Rest-Fehler-Verhalten aufweist.
Ok, vielen Dank für Ihre Information.
Ich habe inzwischen mehrere andere Sachen probiert, aber nur Fehlversuche erhalten.
Also habe ich mich dazu entschlossen mein eigenes Tool, für die Lösung meiner Backup Arbeit, zu schreiben.
Ich habe bereits ein Projekt angefangen und nenne es ZipCrypter Backup.
FAZIT: Offensichtlich ist in meinem System nicht so viel verkehrt wie ich dachte, die oben beschriebene Problematik konnte zwar nicht gelöst, aber aus der Welt geschafft werden und mit dem Ergebnis aus dieser Sache fange ich direkt ein neues Projekt an, welches sich ZipCrypter Backup nennt. Geschrieben in VB2010.
Für alle die das gleiche Problem hatten, gibt es dann in zukunft ein Tool, namens ZipCryper Backup. BTW aktuell (Version 0.03 preAlpha).
Damit können dann Dateien oder Verzeichnisse ausgewählt werden, die dann komprimiert und bei Bedarf verschlüsselt werden. Per Auswahl werden die dann entweder direkt in die Cloud gesendet oder in ein ausgewähltes Verzeichniss kopiert. Welches Verfahren benutzt wird, kann der Benutzer wählen. Ich habe mich für 7Zip und TrueCrypt entschieden. Einfach weil sie Opensource sind.
Ich denke hier ist ENDE. Sollte ich eine funktionierende Version in den nächsten Wochen erschaffen, werde ich gerne den Link teilen.
Ich bedanke mich noch einmal herzlichst für die sehr schnelle und kompetente Hilfe. Es war eine sehr angenehme Konversation.
Grüße, SaMaKl
Hatte mal ein ähnliches Problem: Kein Script, welches ich vorher geschrieben hatte, funktionierte mehr.
Es lag an einem Eintrag in der Registry, man muss dort den Pfad des "System32" Ordners wieder hineinschreiben, damit CMD Diesen nach den Befehlen durchsucht
(Batch ist nix anderes, als Programme innerhalb einer Konsole zu starten)
Eine sehr alte Frage :-)
Aber Programme werden über den Pfad gefunden oder über Variablen. Bei DOS gab es damals comspec oder so ähnlich das auf command.com zeigte. Man sollte auf der Befehlszeile mal 'set' eingeben, also set. Dann sieht man wo alles hingezeigt wird. Auch sollte man in jedem Pfad cmd eingeben können.
Bei OS/2 war dann auch der Befehl start dabei. Man kann damit Programme in einem anderen Task starten - im Hintergrund. Windows hat das heute auch. Batch-Dateien sind deshalb gut um den Computer zu organisieren. Es gibt auch Programme die Starten startbare Dateien zu eingegebenen Uhrzeiten.
Es gibt auch Programme die machen eine Batch-Datei zu einer com oder exe Datei - man kann dann nicht mehr reinsehen (Klartext ist weg).
Erstmal vielen Dank für die Antwort.
Ich habe inzwischen mit Notepad++ verschiedene Sachen ausprobiert. Dazu gehört die Datei in verschiedenen Formaten abzuspeichern. Ich habe sowohl mit den Dateierweiterungen also auch mit dem Dokumentenformat (UTF-8 BOM und Unicode usw.)experimentiert.
Alles hat keinen Effekt auf den Fehler.
Ich habe schon extra-Tools runtergeladen, mit dem ich "txt" Dateien in das Ascii Format umwandeln kann.
-- Kein Effekt
Vielleicht gibt es noch andere Möglichkeiten auf ein Ergebnis zu kommen, oder ich mache einfach nicht das richtige.