Первая строка текстового файла для переменной в пакете

Я пытаюсь вытащить первую строку файла .txt и назначить ее переменной, но внутри цикла. Моя переменная не была назначена правильно. Постоянно показывает "ЭХО выключено". Однако, когда цикл возвращается, он отображается правильно, хотя это тот же код. Как я могу заставить его отображать мой текст, который я хочу в первый раз?

Код:

@Echo off
:ReadLoop
if exist "<Full\Path\Name>\Note0.txt" (
set /p Var=<"<Full\Path\Name>\Note0.txt"
Echo %Var%
pause>nul
goto :ReadLoop
)

Результат, который я получаю, таков:

Echo is off.
Note0 Content
Note0 Content
Note0 Content

person Travis McCurry    schedule 02.03.2015    source источник
comment
Код вроде в порядке. Однако я заметил некоторые странные вещи, которые происходят всякий раз, когда я использую операторы блока if, т.е. если что-то (делать что-то... делать больше). Что я делаю, так это использую встроенные операторы if, такие как, если существует myFile, делают что-то, а другое, если существует myFile, делает все остальное. Просто попробуйте встроенные ifs и посмотрите, изменится ли он.   -  person Randy Rakestraw    schedule 02.03.2015


Ответы (1)


Всякий раз, когда вы set используете переменную в блоке кода в скобках, если вы хотите получить эту переменную в том же блоке кода, вы должны сделать это в стиле отложенного раскрытия. Например:

set "test=apples"
(
    set "test=oranges"
    echo %test%
)

... будет отображать "яблоки", потому что это значение переменной test было при достижении блока кода. С другой стороны,

set "test=apples"
(
    set "test=oranges"
    setlocal enabledelayedexpansion
    echo %test% and !test!
    endlocal
)

будет повторять «яблоки и апельсины», потому что расширение !test! задерживается, а %test% - нет. В окне консоли setlocal /? для получения дополнительной информации.

Теперь примените эти знания к своему коду.

@Echo off
setlocal

:ReadLoop
if exist "<Full\Path\Name>\Note0.txt" (
    set /p Var=<"<Full\Path\Name>\Note0.txt"
    setlocal enabledelayedexpansion
    Echo !Var!
    endlocal
    pause>nul
    goto :ReadLoop
)

... даст вам ожидаемый результат. Вы можете активировать enabledelayedexpansion в начале вашего скрипта чуть ниже @echo off, но это может иногда иметь неблагоприятные последствия при установке значений переменных, если эти значения содержат восклицательные знаки. В любом случае, не стесняйтесь, но помните мое предупреждение, если вы когда-нибудь столкнетесь с проблемами.

person rojo    schedule 03.03.2015