Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Почему использование goto в for приводит к 1разовому выполнению цикла? (http://forum.oszone.net/showthread.php?t=265575)

nfs911 05-08-2013 01:21 2196505

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

@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 2196508

Цитата:

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

Лучше решать правильную проблему: зачем Вам goto внутри цикла разбора?

nfs911 05-08-2013 09:21 2196547

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 2196548

nfs911, Вы не ответили на вопрос — зачем? Приведите реальное ТЗ.

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

nfs911 05-08-2013 10:41 2196575

какая альтернатива goto?если нужно if not строка1==строка2 goto cod1
goto else

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

amel27 05-08-2013 10:45 2196577

Цитата:

Цитата nfs911
в папке где мнооого файлов может не сработать
Как решить эту проблему? »

это не ошибка, а предсказуемое поведение батника, т.к. метка командой не является
Код:

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

Цитата:

Цитата nfs911
какая альтернатива 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 2196583

amel27, рад видеть Вас в добром здравии!

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

Цитата:

Цитата nfs911
какая альтернатива 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 2196589

Iska, на c++ похоже.прийду домой,попробую.amel27, ваш вариант тоже интересный.Благодарю

sov44 05-08-2013 11:52 2196604

amel27, в качестве ликбеза, почему echo/ ? Есть ли разница между echo/ и echo. ?

amel27 05-08-2013 12:15 2196616

sov44, символ "." используется в именах файлов - со всеми вытекающими последствиями
в качестве эксперимента:
Код:

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

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

Цитата:

Цитата nfs911
на c++ похоже »

CMD - интерпретатор, а CPP - компилятор!

nfs911 05-08-2013 17:11 2196737

Чтото неполучается
Код:

@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



Время: 06:38.

Время: 06:38.
© OSzone.net 2001-