2011-01-11 4 views
1
set a=file 
if exist "folder\%a%" ( 
set /p x= < "folder\%a%" 
echo %x% 
) 

Ich habe für eine lange Zeit Batch-Dateien geschrieben, aber ich verstehe es nicht, warum dieser Code funktioniert nicht. Ich erwarte, dass der Code den Inhalt der % a% ausgibt. aber all darauf zurückgibt, ist der Status von ECHO (Echo ist ON)Batch-Input-Umleitungsoperator

das% a% (Datei) enthält eine Zeichenfolge ('Keyword'), die erwartet wird, werden wiederholt, wenn Satz in% x%

ich versuche sogar eine Verlängerung (.txt) zu setzen, aber noch ist es nicht funktioniert

Antwort

2

es funktioniert nicht, weil der komplette Klammer Block (und auch echo% x%) ausgewertet wird, bevor die „gesetzt/p "wird ausgeführt, Sie können zu verzögerter Expansion wechseln.

SETLOCAL EnableDelayedExpansion 
set a=file 
if exist "folder\%a%" ( 
set /p x= < "folder\%a%" 
echo !x! 
) 

[EDIT]

Dieser Code auch Ausrufezeichen im Dateinamen

set "a=folder\foo!bar.txt" 
SETLOCAL EnableDelayedExpansion 
if exist "!a!" (
    set /p x= < "!a!" 
    echo !x! 
) 
+0

Darf ich Sie fragen, was bedeutet verzögerte Expansion? – kapitanluffy

+0

Wenn% a% enthält! (Beispiel "foo! bar.txt"), dann bricht Ihr Code – Anders

+1

% var% expandiert den Zeilen- oder Klammernblock im Moment des Lesens, bevor irgendein Befehl der Zeile oder des Blocks ausgeführt wird. Die verzögerte Erweiterung muss aktiviert sein und erweitert dann die! Var! wie% var%, aber im Moment kurz bevor man jeden Befehl einer Zeile oder eines Blocks ausführt, auch "set /?" erklärt es – jeb

1
if exist "folder\%a%" ( 
set /p x=< "folder\%a%" 
SETLOCAL ENABLEDELAYEDEXPANSION&echo !x!&ENDLOCAL 
) 

Dies ist im Grunde der gleiche Code wie jeb akzeptiert, aber ENABLEDELAYEDEXPANSION wird das nicht beeinflussen Pfad, also Dateinamen mit! wird immer noch funktionieren (% wird wahrscheinlich nicht funktionieren, aber das ist ein allgemeines Problem mit Batch-Dateien und Dateinamen)

set /p x= < .\somefile ist ein bisschen ein Hack, möchten Sie vielleicht mit FOR /F "tokens=*" %%A betrachten ... aber FOR liest jede Zeile es sei denn, Sie setzen ein wenn innerhalb der DO. Sie enden also mit etwas Hässlichem wie diesem, wenn Sie nur die erste Zeile möchten:

set eof=0 
for /F "tokens=*" %%A IN ('type "folder\%a%" 2^>nul') DO (
    SETLOCAL ENABLEDELAYEDEXPANSION&(if "!eof!"=="0" (echo.%%A))&ENDLOCAL 
    set eof=1 
) 
+0

Ein FOR-Loop kann mit einem goto: label brechen – jeb