PDA

Показать полную графическую версию : Почему использование goto в for приводит к 1разовому выполнению цикла?


nfs911
05-08-2013, 01:21
Всем привет!
Вот
До:
@ECHO OFF
FOR /F "tokens=*" %%A IN ('dir /s /b /a-d "%CD%\"') DO (
echo "%%A"
)
PAUSE

После:
@ECHO OFF
FOR /F "tokens=*" %%A IN ('dir /s /b /a-d "%CD%\"') DO (
echo "%%A"
goto test1
:test1
echo Выведет первый файл и цикл завершится
)
PAUSE

в папке где мнооого файлов может не сработать

Как решить эту проблему?

Iska
05-08-2013, 01:49
Как решить эту проблему? »
Лучше решать правильную проблему: зачем Вам goto внутри цикла разбора?

nfs911
05-08-2013, 09:21
Iska, @ECHO OFF
FOR /F "tokens=*" %%A IN ('dir /s /b /a-d "%CD%\"') DO (
echo "%%A"
goto test1
:next
pause
)
:next2
echo обходим :test1 после завершения цикла
goto exit

:test1
echo Выведет первый файл и цикл завершится
goto next
rem возвращаемся обратно в цикл для перечисления оставшихся файлов

:exit
PAUSE


Пробовал,аналогично.

Iska
05-08-2013, 09:29
nfs911, Вы не ответили на вопрос — зачем? Приведите реальное ТЗ.

Я не припомню ни единого случая, чтобы мне хоть раз приходилось пользовать «goto :label» на «:label» внутри цикла разбора. Как правило, всё решается условными операторами и процедурами.

nfs911
05-08-2013, 10:41
какая альтернатива goto?если нужно if not строка1==строка2 goto cod1
goto else

(пишу коротка потомучто я с телефона)

amel27
05-08-2013, 10:45
в папке где мнооого файлов может не сработать
Как решить эту проблему? »это не ошибка, а предсказуемое поведение батника, т.к. метка командой не являетсяFOR /F "tokens=*" %%A IN ('dir /s /b /a-d "%CD%\"') DO (
echo "%%A"
goto test1
:test1
echo Выведет первый файл и цикл завершится
)
PAUSEинтерпретируется как последовательность N команд:
echo "file1"
goto test1
echo Выведет первый файл и цикл завершится

echo "file2"
goto test1
echo Выведет первый файл и цикл завершится

echo "file3"
goto test1
echo Выведет первый файл и цикл завершится


echo "fileN"
goto test1
echo Выведет первый файл и цикл завершится

:test1
echo Выведет первый файл и цикл завершится
)
PAUSE

какая альтернатива goto?если нужно if not строка1==строка2 goto cod1
goto else »как и в любом процедурном языке - оформить код процедурой и вызывать по условию:@echo off

if not "строка1"=="строка2" (call:cod1 Параметр1 "Параметр 2") else call:cod2

exit

:: -- блок функций --

:cod1
echo какой-то код 1
echo/
echo %~1
echo %~2
goto:eof

:cod2
echo какой-то код 2
echo/
echo %*
goto:eof

Iska
05-08-2013, 11:00
amel27, рад видеть Вас в добром здравии!

Мне такая трактовка, увы, не приходила в голову :(.

какая альтернатива goto?если нужно if not строка1==строка2 goto cod1
goto else »
if "строка1" neq "строка2" (
команда A1
команда A2
команда AN
) else (
команда B1
команда B2
команда BN
)

nfs911
05-08-2013, 11:18
Iska, на c++ похоже.прийду домой,попробую.amel27, ваш вариант тоже интересный.Благодарю

sov44
05-08-2013, 11:52
amel27, в качестве ликбеза, почему echo/ ? Есть ли разница между echo/ и echo. ?

amel27
05-08-2013, 12:15
sov44, символ "." используется в именах файлов - со всеми вытекающими последствиями
в качестве эксперимента:copy/y %windir%\notepad.exe .\echo. >nul
echo.
PAUSE

copy/y %windir%\notepad.exe .\echo.123 >nul
echo.123

на c++ похоже »CMD - интерпретатор, а CPP - компилятор!

nfs911
05-08-2013, 17:11
Чтото неполучается
@ECHO OFF
FOR /F "tokens=*" %%C IN ('dir /s /b /a-d "%1\*.cab"') DO (
PUSHD %%~dpC
for /f "tokens=*" %%a in ('type "%%~dpCCheck.txt" ^| findstr.exe /r /x /c:"Возможность применения :.*"') DO if not "%%a" == "Возможность применения : Да" (
move %%C dont_install
) else (
for /f "tokens=*" %%b in ('type "%%~dpCCheck.txt" ^| findstr.exe /r /x /c:"Состояние :.*"') DO if not "%%b" == "Состояние : Отсутствует" (
move %%C exist
)
POPD
)
ECHO Нажмите любую кнопку для выхода
PAUSE>nul




© OSzone.net 2001-2012