Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
24 / 23 / 6
Регистрация: 18.08.2013
Сообщений: 637
1

Команды в цикле выполняются на один раз больше положенного числа раз

22.06.2016, 19:12. Показов 2360. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть следующий скрипт:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rem Данный батник производит преобразование имен телефонный аудиозаписей для их сортировки по дате записи
setlocal EnableDelayedExpansion
title Rename Voice Records
%~d1
cd %~dp1
for %%A in (*.amr) do (
    set temp=%%A
    set yyyy=20!temp:~7,2!
    set mm=!temp:~4,2!
    set dd=!temp:~1,2!
    set hh=!temp:~10,2!
    set mi=!temp:~13,2!
    echo %%A>>old.txt
    rename "%%A" "A!yyyy!-!mm!-!dd!_!hh!.!mi!.amr"
)
pause
Если файлов amr 3 штуки, то цикл выполнится 4 раза, если 2 - 3 раза и так по аналогии.. Если файлов amr нет - то тогда цикл выполняться не будет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2016, 19:12
Ответы с готовыми решениями:

Вывести числа, которые встречаются в массиве несколько раз / один раз
дан массив состоящий из 100 целых чисел. а)Вывести все числа,которие встречаются в етом массиве...

Функция в цикле срабатывает один раз
Функция " deleteDigits();", с передаваемым массивом через ссылку срабатывает один раз, хоть и...

Как распечатать в цикле один раз?
for(int i=0; i<zkhOnPage.size(); i++){ ...

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

9
Любознательный
5668 / 1683 / 314
Регистрация: 10.03.2016
Сообщений: 3,824
22.06.2016, 20:36 2
Цитата Сообщение от George_Smith Посмотреть сообщение
Если файлов amr 3 штуки, то цикл выполнится 4 раза, если 2 - 3 раза и так по аналогии..
Из чего следует такой вывод?
0
3460 / 1998 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
22.06.2016, 20:44 3
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

При использовании конструкций типа
Цитата Сообщение от George_Smith Посмотреть сообщение
Windows Batch file
6
for %%A in (*.amr) do (
пакетный файл будет всегда переименовывать (или, по крайней мере, пытаться переименовывать) уже переименованный файл.

Поэтому количество обрабатываемых файлов необходимо зафиксировать на момент начала их обработки (переименования) с помощью конструкции
Windows Batch file
6
for /f "delims=" %%A in ('dir /a-d /b *.amr') do (
.
0
Любознательный
5668 / 1683 / 314
Регистрация: 10.03.2016
Сообщений: 3,824
22.06.2016, 21:00 4
Цитата Сообщение от ComSpec Посмотреть сообщение
пакетный файл будет всегда переименовывать (или, по крайней мере, пытаться переименовывать) уже переименованный файл.
Хмм, как это воспроизвести? Попытался упростить немного:
В папке 4 файла
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
setlocal enabledelayedexpansion
set d1=c:\TEMP\TEST
set n=0
cd /d %d1%
for %%A in (*.txt) do (
    echo %%A>>old.log
    rename "%%A" "%%~nA-1.txt"
    set /a n+=1
)
(echo.&&echo Проходов: !n!)>>old.log
pause
Результат:
1.txt
2.txt
3.txt
4.txt

Проходов: 4
0
3460 / 1998 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
22.06.2016, 21:32 5
Цитата Сообщение от YuS_2 Посмотреть сообщение
Хмм, как это воспроизвести?


Вот так...

Файлы: 1.txt, 11.txt, 111.txt, 1111.txt.

Код:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
setlocal enabledelayedexpansion
 
for %%A in (*.txt) do (
    echo %%A
    rename "%%A" "!random!.txt"
    set /a n+=1
)
 
echo.
echo Проходов: !n!
 
endlocal
pause
.

Результат:

1.txt
11.txt
111.txt
1111.txt
26122.txt

Проходов: 5
Для продолжения нажмите любую клавишу . . .
.
1
24 / 23 / 6
Регистрация: 18.08.2013
Сообщений: 637
22.06.2016, 21:51  [ТС] 6
Цитата Сообщение от YuS_2 Посмотреть сообщение
Из чего следует такой вывод?
Проверил на трех файлах amr. В результате один файл переименовывается два раза.

Добавлено через 3 минуты
Цитата Сообщение от ComSpec Посмотреть сообщение
пакетный файл будет всегда переименовывать (или, по крайней мере, пытаться переименовывать) уже переименованный файл
Скажите пожалуйста, а это только при переименовании или при других операциях тоже?
Просто использовал след. скрипт:
Windows Batch file
1
2
3
for %%A in (*.avi) do (
    ffmpeg.lnk -i "аргументы для конвертирования"
)
Цикл проходил каждый файл по разу и не было таких проблем.

Добавлено через 6 минут
Цитата Сообщение от ComSpec Посмотреть сообщение
Поэтому количество обрабатываемых файлов необходимо зафиксировать на момент начала их обработки (переименования) с помощью конструкции
Спасибо огромное! Исправил свой цикл на Ваш и все стало на свои места.
0
3460 / 1998 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
22.06.2016, 21:55 7
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

Цитата Сообщение от George_Smith Посмотреть сообщение
Скажите пожалуйста, а это только при переименовании или при других операциях тоже?


Это может происходить только при переименовании и при операциях, в результате которых в каталог с обрабатываемыми файлами добавляются новые файлы, соответствующие заданной маске.

Для приведённой Вами операции этот "эффект" не будет иметь место.
0
24 / 23 / 6
Регистрация: 18.08.2013
Сообщений: 637
22.06.2016, 22:01  [ТС] 8
Цитата Сообщение от ComSpec Посмотреть сообщение
Windows Batch file
'dir /a-d /b *.amr'
А можно ли сделать так, чтобы учитывались только файлы *.amr, у которых, к примеру, первый символ не А? Просто предположим ситуацию, когда в одной папке есть "переименованные" и "непереименованные" файлы. Нужно, чтоб цикл их фильтровал. Можно ли это сделать, используя dir или нужно добавлять IF в тело цикла?
P.S. Чем кавычки "" отличаются от апострофов '' в for /F ?
0
Любознательный
5668 / 1683 / 314
Регистрация: 10.03.2016
Сообщений: 3,824
22.06.2016, 22:11 9
Цитата Сообщение от ComSpec Посмотреть сообщение
Windows Batch file
1
rename "%%A" "!random!.txt"
Понятно, спасибо.
Что интересно, при переименовании, если в имени целевого файла (в любом месте имени) присутствует %%-переменная цикла, то число проходов соответствует числу файлов, а если имя не содержит переменную, тогда число проходов n+1 ...
Записать бы куда-нибудь эту особенность, чтобы не забылось со временем... как говорится: чудны дела твои, микрософт

Добавлено через 6 минут
Цитата Сообщение от George_Smith Посмотреть сообщение
А можно ли сделать так, чтобы учитывались только файлы *.amr, у которых, к примеру, первый символ не А?
Windows Batch file
1
dir /a-d /b *.amr|findstr /v /rc:"^[A]"
Цитата Сообщение от George_Smith Посмотреть сообщение
Чем кавычки "" отличаются от апострофов '' в for /F ?
for /?
0
3460 / 1998 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
22.06.2016, 22:13 10
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

Цитата Сообщение от George_Smith Посмотреть сообщение
А можно ли сделать так, чтобы учитывались только файлы *.amr, у которых, к примеру, первый символ не А?


Можно:
Windows Batch file
6
for /f "delims=" %%A in ('dir /a-d /b *.amr^| findstr /biv "A"') do (
.





Цитата Сообщение от George_Smith Посмотреть сообщение
Чем кавычки "" отличаются от апострофов '' в for /F ?


Двойные кавычки используются в такой конструкции для обработки заключённых в них строк, а одинарные — для обработки вывода результата выполнения заключённых в них команд.
0
22.06.2016, 22:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2016, 22:13
Помогаю со студенческими работами здесь

Как в цикле можно выполнить действие один раз?
Есть цикл, который выполняется n раз. Но 1 действие в этом цикле необходимо выполнить только 1...

В цикле почему-то проходит по условию только один раз
Задача такая: Дан одномерный массив и натуральных чисел. Удалить из него все тройки подряд идущих...

Как в цикле выполнить определенное действие один раз?
for (int i = 0; i < Notes.Count; i++) { if...

вывожу комментарии в цикле Но почемута первый коммент в 5 раз больше по высоте остальных!
вывожу комментарии в цикле Но почемута первый коммент в 5 раз больше по высоте остальных! <?php ...

Окно появилось один раз и больше не появлялось
Это консольное приложение, при первом запуске появилось окно и больше его нет В сообщениях...

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


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

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