Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
1

Почему скрипт входит в бесконечный цикл на Win XP ?

18.11.2015, 00:13. Показов 2046. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую.
Собственно сабж

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
 
:FILENAME
if not defined postfix (set "postfix=")
if not defined count (set count=1)
set "FILE=%~dp0empty%postfix%.txt"
if exist %FILE% (
                    set /a count+=1
                    set "postfix=_(%count%)"
                    call :FILENAME
                    )
echo.>%FILE%
exit
Начиная с висты работает, а на Win XP уходит в бесконечный цикл, а потом завершает скрипт.
Почему ?
Чую, что решение простое, но сам додуматься не могу.

Заранее спасибо

Добавлено через 8 минут
Сам спросил ,сам ответил
Windows Batch file
8
set FILE="%~dp0empty%postfix%.txt"
Теперь работает
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2015, 00:13
Ответы с готовыми решениями:

Кольцевой список, программа входит в бесконечный цикл
здравствуйте, помогите пожалуйста с задачей. Я ее написал, но у меня всегда идет бесконечный цикл,...

Не входит в систему - бесконечный цикл вход-выход
Перед тем, как вы отправите в соседние темы, скажу: я их читал и следовал написанному. А именно:...

Программа входит в бесконечный цикл при изменении двумерного массива
Написал код для задания: "Ввести двумерный массив А (NxM). Каждый второй элемент в массиве с...

Почему цикл на при 1 уходит в бесконечный цикл?
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stdio.h> #include <string.h> int...

15
3460 / 1998 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
18.11.2015, 03:37 2
Лучший ответ Сообщение было отмечено vavun как решение

Решение

vavun, вот так всё-таки надёжнее и логичнее:


Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
setlocal enableextensions
 
set count=1
set "postfix="
 
:FILENAME
set "FILE=%~dp0empty%postfix%.txt"
if exist "%FILE%" (
                    set "postfix=_(%count%)"
                    set /a count+=1
                    call :FILENAME
                   )
rem:>"%FILE%"
 
endlocal
exit /b

.
2
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
18.11.2015, 03:55  [ТС] 3
Согласен, спасибо )
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
20.11.2015, 11:36 4
Лучший ответ Сообщение было отмечено vavun как решение

Решение

вместо call :FILENAME лучше goto FILENAME,
быстрее, и никогда не уйдет в переполнение стека.
2
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
20.11.2015, 20:47  [ТС] 5
О боги ! Почему оно не работает ?

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
setlocal enableextensions
 
 
if "%1"=="" (
      set count=1
      set "postfix="
 
      :FILENAME
      set "FILE=%~dp0empty%postfix%.txt"
      if exist "%FILE%" (
                    set "postfix=_(%count%)"
                    set /a count+=1
                    call :FILENAME
                   )
      echo "%FILE%"
      pause
)
Господа, что я делаю не так ?
Где эта элементарная загвоздка ?
Почему она не назначается ?

Добавлено через 12 минут
А так работает
Windows Batch file
5
if "%1"=="" call (


Добавлено через 3 минуты
А нет, не работает ...
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
20.11.2015, 20:54 6
Попытка вызова метки из под скобочной конструкции...

Вообще оформи этот функционал нормально, как отдельную подпрограмму, и вызывай ее через call

Windows Batch file
1
if "%~1"=="" call :FILENAME
и т.д.
1
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
20.11.2015, 21:01  [ТС] 7
Цитата Сообщение от Dragokas Посмотреть сообщение
оформи этот функционал нормально, как отдельную подпрограмму
А я как раз пытался от этого отказаться Если разбить на отдельные составляющие и вызывать через call, то работает

Цитата Сообщение от Dragokas Посмотреть сообщение
Попытка вызова метки из под скобочной конструкции..
А можно поподробнее с этого места ?
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
20.11.2015, 21:23 8
Цитата Сообщение от vavun Посмотреть сообщение
А я как раз пытался от этого отказаться
Не ты ли в соседней теме рекомендовал юзеру не использовать слишком "пирамидальную" конструкцию кода?

Цитата Сообщение от vavun Посмотреть сообщение
А можно поподробнее с этого места ?
А, нет, работает. Что-то подзабыл, в каких случаях так нельзя.

В твоем случае, попытка раскрыть переменную из под того же блока скобок, где и происходило присвоение значения.
1
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
20.11.2015, 22:20  [ТС] 9
Ругаться матом скоро буду

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
setlocal enableextensions
 
 
if "%~1"=="" (call :EMPTY & exit /b)
if "%~1" neq "" (call :FULL & exit /b)
 
:EMPTY
echo There is no arg. Look "%1"
exit /b
 
:FULL
echo Here is the arg "%1"
exit /b

Наличие первого аргумента определяется верно
Но выводить его он не хочет ни в какую

Добавлено через 38 секунд

Не по теме:

Цитата Сообщение от Dragokas Посмотреть сообщение
Не ты ли в соседней теме
Вроде бы не я :pardon:



Добавлено через 16 минут
Думал по-быстрому сделаю, но не вышло.
В общем ТЗ:

При запуске скрипта без параметров
Код
batfile.bat
создать файл empty.txt, если такой есть, то empty_(1).txt и тд, примерно как тут
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
set count=1
set "postfix="
 
:FILENAME
set "FILE=%~dp0empty%postfix%.txt"
if exist "%FILE%" (
                    set "postfix=_(%count%)"
                    set /a count+=1
                    call :FILENAME
                   )
rem:>"%FILE%"
 
endlocal
exit /b
Если скрипту был передан аргумент
Код
batfile.bat arg
То передать этот аргумент программе
Windows Batch file
@echo off
prog.exe "%1"
Думал ничего сложного
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
20.11.2015, 22:21 10
vavun, разумеется не выводит. %1 в подпрограмме обозначает аргумент подпрограммы, а не пакетного файла.
1
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
20.11.2015, 22:22  [ТС] 11
Цитата Сообщение от Dragokas Посмотреть сообщение
%1 в подпрограмме обозначает аргумент подпрограммы
А так прокатит ? )

Windows Batch file
call :PROG "%1" & exit /b
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
20.11.2015, 22:24 12
Лучший ответ Сообщение было отмечено vavun как решение

Решение

Воткнуть 3-й строкой кода ComSpec:

Windows Batch file
1
if "%~1" neq "" (prog.exe "%~1"& exit /B)
и все ТЗ решено.

Добавлено через 1 минуту
Цитата Сообщение от vavun Посмотреть сообщение
А так прокатит ? )
Только тильду не забывай. Она лишние кавычки удаляет.
1
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
20.11.2015, 22:24  [ТС] 13
Прокатило вроде

Добавлено через 28 секунд
Цитата Сообщение от Dragokas Посмотреть сообщение
Воткнуть 3-й строкой кода ComSpec:
Сейчас проверим, благодарю
0
724 / 323 / 133
Регистрация: 17.03.2014
Сообщений: 811
20.11.2015, 22:25 14
может быть так:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
setlocal enableextensions
        
if "%~1"=="" (call :EMPTY %* & exit /b)
if "%~1" neq "" (call :FULL %* & exit /b)
 
:EMPTY
echo There is no arg. Look "%1"
exit /b
 
:FULL
echo Here is the arg "%1"
exit /b
1
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
20.11.2015, 22:33  [ТС] 15
Ну да, логично

Добавлено через 17 секунд
Dragokas, благодарю

Добавлено через 26 секунд
Цитата Сообщение от b0gus Посмотреть сообщение
может быть так:
В принципе можно и так

Добавлено через 5 минут
Dragokas, сработало как нужно
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
21.11.2015, 23:14 16
Потребовалось сегодня чисто на cmd реализовать максимально быстрый код для поиска свободного имени, подобно как у vavun.
Сделал через кеш переименований.
По условию, кол-во файлов с одинаковым именем будет превышать 50, при этом известно что папка заранее пуста (ну или по крайней мере не содержит огромного кол-ва файлов с одинаковыми именами).


Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@echo off
SetLocal EnableExtensions
 
call :GetEmptyName "%~dp0" test.txt file
rem:>"%file%"
 
call :GetEmptyName "%~dp0" test.txt file
rem:>"%file%"
 
call :GetEmptyName "%~dp0" test.txt file
rem:>"%file%"
 
:: и.т.д.
 
pause
goto :eof
 
:GetEmptyName %1-Folder %2-FileName %3-Var.Return
  if exist "%~1\%~2" (
    if defined Empty[%~2] (
      call call :CheckKnownName "%~1" "%~2" "%~3" "%%Empty[%~2]%%" || (
        set SystemNum=0
        call :GetEmptyNameFast "%~1" "%~2" "%~3"
      )
    ) else (
      set SystemNum=0
      call :GetEmptyNameFast "%~1" "%~2" "%~3"
    )
  ) else (
    set "%~3=%~2"
  )
exit /B
 
:CheckKnownName %1-Folder %2-FileName %3-Var.Return %4-index
  set idx=%~4
  set /a idx+=1
  set "NewFileName=%~n2 (%idx%)%~x2"
  if exist "%~1\%NewFileName%" exit /B 1
  set "%~3=%NewFileName%"
  set "Empty[%~2]=%idx%"
exit /B 0
 
:GetEmptyNameFast %1-Folder %2-FileName %3-Var.Return
  set /a SystemNum+=1
  Set "NewFileName=%~n2 (%SystemNum%)%~x2"
  if exist "%~1\%NewFileName%" (
    goto GetEmptyNameFast
  ) else (
    set "%~3=%NewFileName%"
    set "Empty[%~2]=%SystemNum%"
  )
exit /B
1
21.11.2015, 23:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2015, 23:14
Помогаю со студенческими работами здесь

Почему если условие входа в цикл не выполняется, функция заново входит в цикл
Сам код: private void traverse_node(TreeControlItem node) { TreeControlItem...

Почему бесконечный цикл?!
Доброго дня! Будьте так любезны - подскажите новичку - почему при вызове скрипта всплывающего...

почему данный цикл-бесконечный?
Процедура должна выполнять поиск последнего вхождения подстроки s1 в строку s, но цикл никкак не...

Цикл по коллекции бесконечный, почему?
Вот такой код: #include <iostream> #include <cstdlib> using namespace std; int main() {

InputMismatchException почему бесконечный цикл при вводе?
Всем доброго времени! Изучаю исключения в Java. Написал небольшую тестовую программу. Смысл в том,...

Нужно детально разобрать, почему цикл бесконечный
Вот имеется цикл double n=50; while(n>0) n+=15; printf("%lf",n); Мне нужно понять,почему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru