2017-11-14 2 views
0

entsprechenden Code sieht wie folgt aus:erzeugt aus Batch-Skript line ‚ " Zu diesem Zeitpunkt war unerwartet", wenn [file] existieren (...

cd /d %~dp0 

if exist filename.txt (
    echo %date% %time% *** text... >> filename2.txt 
    echo ============================== 
    echo === text.......   === 
    echo === text.......   === 
    echo === text....... (text...) === 
    echo === text (text... 
    echo === text...). 
    :loop 
     set /p "varx= text: " 
    if "%varx%" neq "xxxx" goto loop 

... more script... 

) 

Have Hochs und Tiefs nach Lösungen gesucht ...

Die Sache ist, dass das für eine lange Zeit arbeitete ... dann änderte ich, was ich dachte, war einige harmlose Sachen und kann nicht herausfinden, wo das Problem liegt ...

so ein obskures Problem zu lösen..ugh!

Antwort

1

WELL ... Ich poste dies als Q & A ... weil ich mein eigenes Problem gelöst habe (nahm mich ein paar Tage von Versuch und Irrtum, um einzugrenzen und das Problem zu beheben). Ich hoffe, dass dies einige arme Seele auch helfen und sie eine Menge Herzschmerz und ein paar Haarsträhnen zu retten ...

Die Sache, die mich am meisten dachte war die zweite Kugel in Bezug auf schlechte Handhabung von Schleifen in If Aussagen ... aber das war nicht der wahre Grund aber etwas ähnliches ...

Es stellt sich heraus, das Problem mit dem Gebrauch war „(‘ und/oder ‚)‘ auf den ECHO Linien. ..

Ich dachte, das war harmlos ... Ich verwende Klammern in ECHO Linien an vielen Orten, und diese Die Zeilen waren ungefähr 10-15 Zeilen von der Stelle entfernt, an der die Fehlermeldung generiert wurde, also dachte ich natürlich nicht, dass dies die Quelle war.

aber es stellt sich heraus, dass der Interpreter eindeutig nicht die Verwendung mag von ‚(‘ oder ‚)‘ sogar auf ECHO Linien wenn sie innerhalb der If-Anweisung Blöcke verwendet werden. Es muss noch behandeln sie als Sonderzeichen in diesem Zusammenhang ... es eindeutig nicht, sie nicht ignorieren ...

Lösung:

Entweder nehmen die ‚(‘ und ‚)‘ out von diesen 3 Zeilen über ODER einfach REM diese Zeilen lösten das Problem und die Fehlermeldung ging weg ... alles ist endlich gut ...

BTW ist es möglich, dass das eine ähnliche Sache auch für FOR-Aussagen gelten kann (ich erinnere mich vage daran, etwas über FOR zu lesen, das seltsamerweise auch funktioniert).

Also Denkanstoß.

1

Die gesamte zusammengesetzte Aussage von der if exist ... ( bis zur schließenden Klammer ist ein code block.

Innerhalb eines code block, Etiketten sind nicht erlaubt, ein un-escaped ) den Block beenden und jede %var%, durch die für Variablenwert ersetzt wird, wenn der Block angetroffen wird.

Sie benötigen die :loop Routine (einfachste Weg) call

if exist filename.txt (
    echo %date% %time% *** text... >> filename2.txt 
    echo ============================== 
    echo === text.......   === 
    echo === text.......   === 
    echo === text....... (text...^) === 
    echo === text (text... 
    echo === text...^). 
    call :loop 

... more script... 

) 

... etc

goto: eof

: loop set/p "VARx = text:" wenn "% varx%" neq "xxxx" goto schleife

goto: eof

Notiere die goto :eof ist definiert "go to end-of-file" (Der Doppelpunkt ist erforderlich)

Notiere die call hat einen Doppelpunkt vor dem Etikett zu sein - dies zeigt es ist eine interne Routine - es befindet sich in dieses Batch-Datei

Beachten sie, dass jeder ) nun von einem ^ die ) einen gewöhnlichen Charakter macht entgangen ist, kein Statement-Terminator.

Sie haben wahrscheinlich ein Redirector entfernt - jede echo im call ed Verfahren wird in den umgeleiteten Ausgabe gesammelt werden - dass, wenn Sie

(
whatever... 
)>filename 

haben dann alle Daten echo ed innerhalb des code block umgeleitet werden zu der Datei - einschließlichecho es innerhalb einer call Ed-Prozedur. Sie können eine echo innerhalb eines solchen Blocks oder einer solchen Prozedur explizit umleiten, indem Sie beispielsweise echo to console>con verwenden.

Encasing beliebige Folge von Linien in Klammern, so dass es ein code block ermöglicht die Umleitung des echo ed Ausgangs aus dem Block, so

(
echo this 
echo that 
)>filename 

ein neues filename erstellt die Summe des echo es enthält, anstatt zu Hängen Sie an jede Zeile >>filename an. Offensichtlich >> anstelle von > wird an jede vorhandene Datei in der üblichen Weise anhängen.

+0

Wow ... das war eine schnelle Antwort .... Danke für den Einblick, warum das passiert ... Wünschte, ich hätte früher gepostet, wusste aber nicht, wo das Problem lag, bis ich den Schuldigen fand .. Kannst du bitte deine letzte Zeile näher erläutern? –

+0

BTW, stellt sich heraus (war auch ein Problem, nicht nur die) ... –

+0

@ user5764 Wenn Sie glauben, dass diese Antwort oder jede andere Antwort die Lösung für Ihr Problem war, bitte erwägen Sie es als die "akzeptierte Antwort" von Wählen Sie das graue Häkchen auf der linken Seite der Frage. –

Verwandte Themen