Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
12 / 4 / 0
Регистрация: 30.06.2012
Сообщений: 15

Изменение переменной цикла (изменение части пути)

12.02.2014, 18:28. Показов 3593. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть желание упростить жизнь, но что то с реализацией туговато.

Есть каталог с файлами для отправки формата ......\год\месяц\типфайлов\ДиректорииДля Копирования\...

Суть задачи скопировать это добро в другое место например D:\типфайлов\ДиректорииДляКопирования\.. .
(причем у тип файлов необходимо убрать n-ое количество символов слева), после успешного копирования переименовать ДиректорииДляКопирования в ДиректорииДляКопирования! (при последующем запуске скрипта эти директории пропускаются)

C++
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
@echo off
SetLocal enabledelayedexpansion
REM путь по которому ищется почта
REM W:\poshta\2014\02\02TP06P1
REM W:\poshta\"Год(4)"\"Месяц(2)"\"Месяц(2)+Тип(6)"
SET post_dir=D:\poshta
 
REM Устанавливаем текущий месяц
SET month=02
 
REM Устанавливаем текущий год
SET year=2014
 
SET post_dir_full=%post_dir%\%year%\%month%
 
REM Количество символов месяца в названии каталога "Месяц(2)+Тип(6)" будем их вырезать 
set n=2
 
for /f "tokens=1,*" %%a in ('dir %post_dir_full% /b/ad') do for /f "tokens=1,*" %%b in ('dir %post_dir_full%\%%a\?? /b/ad') do call :copy_procedure %%a %%b %post_dir_full%
rem for /f "tokens=1,*" %%a in ('dir %post_dir_full% /b/ad') do for /f "tokens=1,*" %%b in ('dir %post_dir_full%\%%a\?? /b/ad') do xcopy /s /y "%post_dir_full%\%%a\%%b" "D:\4\%%a\%%b\" 
 
goto :eof
 
 
:rename_procedure
for /f "tokens=1" %%i in (./tmp.tmp) do (
    rem В переменной i - filename
    move "%%i" "%%i!"
)
 
goto :eof
 
 
 
:copy_procedure
Set ss1=%1
Set ss2=!ss1:~%n%!
rem Set ss2=!ss1:02t=t!
xcopy /s /y "%3\%1\%2" "D:\4\%ss2%\%2\" 
echo %3\%1\%2 >> tmp.tmp
goto :eof
Столкнулся с такими проблемами:
1) мне не нравится использовать процедуры (считайте это капризом) - как Set ss2=!ss1:~%n%! сделать непосредственно в цикле - вырезать несколько символов слева?
2) как ни пытался переименовать директории ДиректорииДляКопирования в ДиректорииДляКопирования! получаю ошибку что директорий занят другим процессом. Даже писал файл со списком обработанных директорий tmp.tmp.

Помогите дельными советами а то мозги закипят скоро
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2014, 18:28
Ответы с готовыми решениями:

Изменение переменной внутри цикла
Задача перебрать файлы в папке и заархивировать в отдельные файлы for /f %%i in (d.txt) do ( arj32 m -e -y AFN_%NOM%...

Изменение пути присоединенной табличной части к приложению
Добрый вечер, есть БД разделенная, таблицы хранятся на сервере, линки по IP. Дома естественно этого IP нету. Для того, чтобы изменить...

Изменение переменной внутри цикла
Почему в цикле i всё равно изменяется только на 5? for i in range(1, 1000, 5): print(i) i = i * 10

6
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
12.02.2014, 20:09
Bash
1
call call set "ss2=%%%%ss1:~%%n%%%%%%"
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
13.02.2014, 01:18

Не по теме:

Название темы выглядит оптимистично.
Я в свое время пытался именно подменить значение самой переменной цикла.
... каким-то диким способом... вообщем не получилось :)

0
12 / 4 / 0
Регистрация: 30.06.2012
Сообщений: 15
13.02.2014, 14:51  [ТС]
Да уж, печалька. Спасибо за оптимистический прогноз
Если с подменой так не оптимистично, то как хотя бы с переименованием каталогов, а то не совсем красиво запускать второй батник для переименования по списку первого батника.

Добавлено через 4 часа 4 минуты
Переписал цикл, с переменной все удачно сложилось.
Bash
1
2
3
4
5
6
7
8
9
for /f "tokens=1,*" %%a in ('dir %post_dir_full% /b/ad') do (
    for /f "tokens=1,*" %%b in ('dir %post_dir_full%\%%a\?? /b/ad') do (
        Set ss1=%%a
        Set ss2=!ss1:~%n%!
        Echo !ss2!
        xcopy /s /y "%post_dir_full%\%%a\%%b" "D:\4\!ss2!\%%b\" 
        echo %post_dir_full%\%%a\%%b >> tmp.tmp
    )
)
Теперь бьюсь над вторым циклом
Bash
1
2
3
4
for /f "tokens=1" %%i in (./tmp.tmp) do (
    rem В переменной i - путь вида D:\poshta\2014\02\02TP01P2\06 
    move "%%i" "%%i!"
)
Интерпретатор говорит мне что я неправ: "Процесс не может получить доступ к файлу, так как этот файл занят другим процессом."

Оптимальный вариант MOVE вставить в первый цикл, но пока в тупике.
0
1781 / 763 / 130
Регистрация: 09.04.2011
Сообщений: 1,325
13.02.2014, 20:33
Лучший ответ Сообщение было отмечено Dragokas как решение

Решение

ldighost, попробуйте
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
setlocal enabledelayedexpansion
 
:: путь, по которому ишем
set in=c:\апр
:: директория, с имени которой сохранять куст
set out=477765
:: новое имя сохранённой директории с обрезанными двумя знаками
set newdir=!out:~0,-2!
 
:: отсекаем полный путь по директории %out%
for /f "delims=%out%" %%a in ('dir /b /s "%in%\*"') do set old=%%a
:: копируем "правый" отрезок куста в другое место
xcopy /s /i "%old%%out%" "d:\88\%newdir%\" >nul
:: добавляем знак ! в конец директории второго уровня
for /d %%b in (d:\88\%newdir%\*) do ren "%%b" "%%~nb^!"
pause
1
13.02.2014, 23:38

Не по теме:

ldighost, это был очень оффтоп. Я не читал о Вашу задачу :)

0
12 / 4 / 0
Регистрация: 30.06.2012
Сообщений: 15
14.02.2014, 10:49  [ТС]
Всем спасибо за помощь, задачу решил полностью. Нужно было просто экранировать знак ! - "^!"
Привожу рабочий код может кому-нибудь пригодится

Bash
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
@echo off
@SetLocal enabledelayedexpansion
REM путь по которому ищется почта
REM W:\poshta\2014\02\02TP06P1
REM W:\poshta\"Год(4)"\"Месяц(2)"\"Месяц(2)+Тип(6)"
SET post_dir=D:\poshta
 
REM Устанавливаем текущий месяц
SET month=02
 
REM Устанавливаем текущий год
SET year=2014
 
SET post_dir_full=%post_dir%\%year%\%month%
 
for /f "tokens=1,*" %%a in ('dir %post_dir_full% /b/ad') do (
    for /f "tokens=1,*" %%b in ('dir %post_dir_full%\%%a\?? /b/ad') do (
        Set ss1=%%a
        REM Забираем 5 первых символов и вместо них ставим Т => получаем Т6P1 из 02TP06P1
        Set ss2=T!ss1:~5!
        xcopy /s /y "%post_dir_full%\%%a\%%b" "D:\4\!ss2!\%%b\" 
        move /y "%post_dir_full%\%%a\%%b" "%post_dir_full%\%%a\%%b^!"
    )
)
 
pause
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.02.2014, 10:49
Помогаю со студенческими работами здесь

Изменение переменной цикла foreach
Здравствуйте. Возник вопрос: к примеру у меня есть массив (большой размерности). Мне надо каждый элемент умножить на какое-то число....

Почему не срабатывает изменение границы цикла, принятое внутри цикла?
Работает цикл for-Next V_Rod = UBound(Rod, 2) For j = 1 To V_Rod For k = 1 To UBound(BD, 2) ReDim...

Изменение начального положения цикла внутри этого цикла
есть два маппинга в одном 180000 строк в другом 85000 нужно один прогнать по другому на сопоставление по определенному полю, оба столбца...

Изменение пути
Привет8-) Создала БД в основу которого взяла Access. Связала их при помощи компонентов ADO. Полный путь размещения БД: Когда копирую...

Изменение пути
Здравствуйте. Есть таблица user в ней поле avatar оно содержит путь до картинки images/id.jpg как сделать запрос который изменит строку...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru