2016-04-04 3 views
2

Ich habe ein sehr einfaches Problem in der Windows-Batch-Programmierung, aber ich habe die Antwort in den vorhandenen Fragen nicht gefunden.set/p von Eingabedatei funktioniert nur für die erste Zeile in Batch-Datei

Ich möchte den Inhalt von 3 Variablen mit Eingabe aus einer Textdatei (3 Zeilen, eine für jede Variable) füllen und set /p verwenden. Aber es scheint, dass dies nur für die erste Zeile funktioniert, nicht für die anderen.

ist hier ein reproduzierbares Beispiel:

ich diese Batchdatei starten (test.bat):

@echo off 
(
set /p Line1= 
set /p Line2= 
set /p Line3= 
)<%1 
echo I read the following parameter from your %1 config file: 
echo -- Content of line 1:   %Line1% 
echo -- Content of line 2:   %Line2% 
echo -- Content of line 3:   %Line3% 

Die Datei Argument ist test.txt:

The line 1 
The line 2 
The line 2 copied 

Dann habe ich starten Sie einfach 'test.bat test.txt', mit dem folgenden Ergebnis:

Ich lese den folgenden Parameter r aus Ihrer test.txt Konfigurationsdatei:

-- Content of line 1:   The line 1 
-- Content of line 2: 
-- Content of line 3: 

Warum die Linien 2 und 3 von test.txt nicht takken und die correspnding Variablen line2 und line3 leer?

+0

Interessant. Ich kann dein Problem nicht replizieren. Alle drei Zeilen werden für mich korrekt angezeigt. Mein einziger Vorschlag im Moment ist, sicherzustellen, dass Ihre Textdatei enthält, was Sie denken, dass es enthält. – SomethingDark

Antwort

3

Ich kann Ihr Problem reproduzieren, wenn test.txt enthält Unix Zeilenumbrüche 0x0A, und es funktioniert, wenn es Zeilenumbrüche enthält (0x0D 0x0A). Also, wenn das auch die Quelle Ihres Problems ist, konvertieren Sie die Zeilenumbrüche in Ihrem test.txt.

0

Sie könnten eine FOR/f-Schleife:

@echo off 
setlocal 
setlocal EnableDelayedExpansion 

set "linenum=1" 
for /f %%i in (%1) do (
    set "line!linenum!=%%i" 
    set /a "linenum = !linenum! + 1" 
) 

echo %line1% 
echo %line2% 
echo %line3% 
0

Erweiterung wero's answer ein bisschen. Die Lösung ist in der Tat sicherzustellen, dass alle Zeilen in der Datei mit CRLF (\ r \ n) oder LFCR (\ n \ r) enden. Die folgende Diskussion erklärt warum.

SET/P-Verhalten ist nicht vollständig intuitiv. Die folgende Beschreibung des Verhaltens stammt aus einem DosTips-Thread um http://www.dostips.com/forum/viewtopic.php?t=2160.

Lese Zeichen:

Zeichen werden aus dem Eingangsstrom gelesen und in einem Zeichenpuffer gelegt, bis eine von drei Bedingungen erfüllt ist:

  • Bedingung 1: Die letzten 2 lesen char sind CRLF oder LFCR. (eine vollständige Zeile)
  • Bedingung 2: Es gibt 1023 Zeichen im Zeichenpuffer. (Puffer voll)
  • Bedingung 3: Ein Timeout, normalerweise verursacht durch End-of-Stream. (Timeout-Fehler-Zustand) Hinweis - nicht sicher, ob es wirklich eine Timeout-Bedingung ist, ist die Jury noch heraus auf diesen ein

die Puffer char Verarbeitung:

  • Alle Steuerzeichen vom Ende des Zeichenpuffers werden verworfen (möglicher Datenverlust)
  • Wenn ein NUL-Zeichen im Zeichenpuffer vorhanden ist, dann folgen alle Zeichen dem ersten NUL im Zeichen b Uffer wird (Datenverlust) verworfen werden

Übergang von char buffer zu Var.

  • Wenn char Puffer leer Bericht Fehlerzustand: ... Set Errorlevel auf 1 (dh kein Wert eingegeben)
  • Wenn CharBuffer nicht leer ist: ... Bewegen Sie die Zeichenfolge aus char-Puffer Die im Befehl set/p angegebene Variable.

SET/P ist fertig und gibt die Kontrolle an die Batchdatei zurück.

Beachten Sie, dass die längste Zeile, die zuverlässig verarbeitet werden kann, 1021 Byte ist (ohne die abschließende CRLF oder LFCR).

Verwandte Themen