2016-06-25 2 views
1

я написал ниже сценарий:Переменная проблема инициализации в пакетном сценарии

@echo off 
setlocal EnableDelayedExpansion 

REM Collect source filenames from C:\Files and load into C:\doc.txt 
dir C:\sources\Sourcefiles /b /a-d > C:\sourcefilenames.txt 

REM fetch count of source files and store into variable count 
For /F %%I in ('call C:\count.bat ') Do Set count=%%I 

REM loop "count" number of times and echo temp.txt value 
FOR /L %%A IN (1,1,%count%) DO (

REM call line.bat to fetch line 1,line 2 and so on of sourcefilenames.txt for each loop 
call line.bat %%A>C:\temp.txt 

set /p var=<C:\temp.txt 
echo var:%var% ----------> returns previous run value 
type C:\temp.txt ----------. returns current value of temp.txt 

) 

В основном то, что я пытаюсь сделать из приведенного выше сценария: Я создаю переменную (Var) от содержания температуры .txt (данные в temp.txt будут меняться для каждого цикла цикла), которые будут использоваться в нескольких циклах.

Но проблема в том, что я столкнулся: Echo var is:% var% command возвращает мне предыдущее значение запуска не temp.txt current content.whereas команда "type C: \ temp.txt" возвращает мне temp.txt current содержание. (Примечание: если я вызвал/создал переменную «var» из какого-то другого скрипта, он возвращает мне, что предыдущее значение еще возвращает Null)

Ваша помощь/руководство по вышеуказанной проблеме действительно оценено. Thanks

+1

у вас есть [замедленное расширение] (http://stackoverflow.com/a/30284028/2152082) проблема. Используйте 'echo var:! Var!'. – Stephan

ответ

0

Я полагаю, что переменная остается в памяти, не перечитываясь. Исключает ограничение допустимости переменной. SETLOCAL эхо что-то ..... Endlocal или @echo от & SETLOCAL

+0

Спасибо за ваш ответ .. На самом деле я начинаю с Batch-скриптов. Так что, пожалуйста, отредактируйте сценарий по мере необходимости и поделитесь им со мной. – Sunaj

0

Когда CMD.exe встречает блок кода в скобках, он считывает и обрабатывает весь блок перед выполнением. Это может вызвать неинтуитивное поведение. В этом случае ваша линия echo var:%var% анализируется один раз в начале цикла и никогда больше.

Самое простое решение этого заключается в том, чтобы изменить эту строку в

echo var:!var! 

Синтаксис !var! обрабатывается каждый раз через петлю. Это работает, потому что у вас есть enabledelayedexpansion, установленный в вашем скрипте.

Другим обходным решением этой проблемы является удаление скобок и обращение к подпрограмме.

FOR /L %%A IN (1,1,%count%) DO call :loopLineBat %%A 
... rest of script 
exit /b 

:loopLineBat 
>%temp%\temp.txt call line.bat %1 

<%temp%\temp.txt set /p var= 
echo var:%var% 
type %temp%\temp.txt 
exit /b 

Этот цикл делает то же самое, что и выше, но потому что это не в скобках блока, все строки обрабатываются и выполняются в порядке.

+0

Спасибо, Райан .. Ваше предложение решило мою проблему ... :) – Sunaj

+0

Спасибо Stephan & Ryan .. Я пробовал обе работы вокруг и работал отлично, как я искал .. Спасибо, приятель. – Sunaj

+0

Привет, ребята, у меня есть еще один запрос. Не могли бы вы пояснить. Я хочу сохранить вывод ниже сценария в переменную. findstr/R/N "^" C: \ Users \ Sunaj \ Desktop \ batch_script \ doc.txt | find/C ":" Я пытался использовать ------ For/F %% I in ('findstr/R/N "^" C: \ Users \ Sunaj \ Desktop \ batch_script \ doc.txt | find/C ":" ') Устанавливаем var = %% I ----- Но, похоже, из-за двойной цитаты этот вышеприведенный скрипт не работает. Пожалуйста, предложите – Sunaj

Смежные вопросы