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

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

12.02.2014, 18:28. Просмотров 1762. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2014, 18:28
Ответы с готовыми решениями:

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

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

Изменение пути к базе 1С в реестре
Здравствуйте! База 1С переехала на другой жёсткий диск, помогите сделать bat который: 1. Ищет...

Изменение пути в ярлыке в зависимости от текущей даты
Добрий день! Помогите создать BAT для изменения пути в ярлике. Сейчас ярлик настроен на...

Изменение части значения ключа реестра
Добрых всем суток! При работе с реестровыми опреациями, возникла необходимость избирательно менять...

6
Eva Rosalene
Ladybug
4052 / 1591 / 303
Регистрация: 06.01.2013
Сообщений: 4,188
Завершенные тесты: 2
12.02.2014, 20:09 2
Bash
1
call call set "ss2=%%%%ss1:~%%n%%%%%%"
0
Dragokas
Эксперт WindowsАвтор FAQ
17049 / 7106 / 859
Регистрация: 25.12.2011
Сообщений: 10,918
Записей в блоге: 16
13.02.2014, 01:18 3

Не по теме:

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

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

Добавлено через 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
sov44
1760 / 744 / 128
Регистрация: 09.04.2011
Сообщений: 1,314
13.02.2014, 20:33 5
Лучший ответ Сообщение было отмечено 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
Dragokas
13.02.2014, 23:38
  #6

Не по теме:

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

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

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
14.02.2014, 10:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2014, 10:49

Изменение переменной
Есть две переменные 1.set d1=X echo %d1% и 2.set str=A B C D E F G H I J K L M N O P Q R S T U...

Изменение пути распаковки файлов, находящихся в контейнере, созданном Bat to Exe Converter
Возникла проблема, чтобы при запуске bat конвертированного в exe он запускал другие exe файлы из...

Изменение даты создания папки и изменение MAC-адреса
Ребята всем привет. Нужна ваша помощь. Пишу bat для одной операции и столкнулся с проблемой что...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru