BATCH-Datei Befehle: "@ECHO OFF", "REM", "ECHO" usw. -- FUNKTIONIEREN NICHT

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!

samakl 
Fragesteller
 21.08.2013, 22:13

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.

0
WhiteGandalf  22.08.2013, 01:39
@samakl

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.

1
samakl 
Fragesteller
 22.08.2013, 11:40
@WhiteGandalf Vielen Dank ein weiteres mal, für die nette Unterstützung!

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.

0
WhiteGandalf  22.08.2013, 13:27
@samakl

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...

2
WhiteGandalf  22.08.2013, 13:33
@WhiteGandalf

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?!

1
samakl 
Fragesteller
 22.08.2013, 13:48
@WhiteGandalf

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.

0
WhiteGandalf  22.08.2013, 14:28
@samakl

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.

0
WhiteGandalf  22.08.2013, 14:37
@WhiteGandalf

"%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.

1
samakl 
Fragesteller
 22.08.2013, 15:18
@WhiteGandalf

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

0

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).