переместить файлы по папкам согласно списку
имеются файлы:
Иванов Иван Иванович_1.*
Иванов Иван Иванович_2.*
Петров Петр Петрович.*
Сидоров Сидр Сидорович.*
...
нужно раскидать их по папкам (условие распределения берется из txt файла)
txt с условием (заполняет пользователь):
Код:
Самара:
Иванов Иван Иванович_1
Сидоров Сидр Сидорович
Москва:
Иванов Иван Иванович_2
Петров Петр Петрович
т.е. cmd перемещает Иванов Иван Иванович_1.* и Сидоров Сидр Сидорович.* в папку "Самара"
а Иванов Иван Иванович_2.* и Петров Петр Петрович.* в папку "Москва"
как такое реализовать через CMD/BAT с использованием CurrentDir?
|
Цитата:
Цитата deepred
А почему с использованием CD?
|
CD - это currentdir? имеется ввиду чтобы BAT/CMD работал с текущей папкой, в которой сам находится, чтобы не писать лишний раз папку для работы
Цитата:
Цитата deepred
вид файла именно такой, т.е. заголовки с городами могут менять место?
|
не понял вопроса. список городов произвольный, задается пользователем. т.е. может быть и 1 и 5 городов
Цитата:
Цитата deepred
города конечно же могут быть любые?
|
именно те, которые пользователь напишет в txt-файле, такие папки и создавать
|
Вот такая штука вышла...
Обновил код....
Код:
@Echo on && Chcp 1251 && setlocal enabledelayedexpansion
set log=%CD%\log.txt
set $num=0
set String$=String$
:read
for /f "tokens=* delims=" %%a in ('^<"%log%" find /i /v ""') do SET /a $num+=1 && call :func "%%a"
set /a X=%$num%+1 & set $num=0 & goto orgcopy
:func
set String%$num%=%~1
goto :eof
:orgcopy
set /a $num=%$num%+1
if %$num%==%X% goto :eof
set $NSF=!%string$:$=%%$num%!
if /i "%$NSF:~-1%"==":" (set $DSF=%$NSF:~0,-1%) else (
copy /v /y "%$NSF%".* %CD%%$DSF%
goto :orgcopy)
md %CD%\%$DSF%
goto :orgcopy
Если нужно перемещение, а не копирование, то достаточно заменить "copy /v /y" на "move /y". Ключ /y нужен для перезаписывания файлов в целевом каталоге без запроса
|
хм..
1й вариант с русскими именами и двумя вариантами текста батника из-за странной кучи пробелов в строчке 23-24 перед "goto"
2й вариант с английскими именами и с удаленным chcp 1251
в обоих случаях папки не создаются
|
Хм...
То что приведено у тебя в блокноте не верно..., действительно странные пробелы, местами отсутствуют символы "$" и "\". Команды copy и goto не должны быть в одной строке...
В общем прикладываю свой батник, у меня все срабатывает как надо.... и на всякий случай обновлю текст батника в посте, попробуй и оттуда снова взять, мне кажется глюк из-за этого может быть...
|
El Sanchez |
30-06-2010 11:24 1444366 |
shadowbat, предложу-ка свой вариант:
Код:
@Echo Off
SetLocal EnableDelayedExpansion
Set Source=C:\Source
Set Output=C:\Output
Set UsersLog=C:\Source\UsersLog.txt
For /F "UseBackQ Tokens=*" %%A In ("%UsersLog%") Do (
Echo %%A|FindStr :>nul&&(Set OutputDir=%%A&MD "%Output%\!OutputDir:~0,-1!" 2>nul)||Move /Y "%Source%\%%A.*" "%Output%\!OutputDir:~0,-1!" 1>nul
)
EndLocal
|
deepred, благодарю за файл. срабатывает
(благодаря совету заменил "" %CD%%$DSF% "" на "" %CD%\%$DSF%"")
РЕШЕНИЕ1:
Код:
Chcp 1251
@Echo Off
setlocal enabledelayedexpansion
set log=%CD%\Список.txt
set $num=0
set String$=String$
:read
for /f "tokens=* delims=" %%a in ('^<"%log%" find /i /v ""') do SET /a $num+=1 && call :func "%%a"
set /a X=%$num%+1
set $num=0
goto orgcopy
:func
set String%$num%=%~1
goto :eof
:orgcopy
set /a $num=%$num%+1
if %$num%==%X% goto end
set $NSF=!%string$:$=%%$num%!
set ch=%$NSF:~-1%
Echo %$NSF% %ch%
if /i "%ch%"==":" (set $DSF=%$NSF:~0,-1%) else (
move /y "%$NSF%".* %CD%\%$DSF%
goto :orgcopy)
md %CD%\%$DSF%
goto :orgcopy
:end
chcp 866
El Sanchez, благодарю! просто реализовано..
я добавил currentdir и chcp - работает на ура. =)
РЕШЕНИЕ2:
Код:
chcp 1251
@Echo Off
SetLocal EnableDelayedExpansion
Set Source=%CD%
Set Output=%CD%
Set UsersLog=%CD%\Log.txt
For /F "UseBackQ Tokens=*" %%A In ("%UsersLog%") Do (
Echo %%A|FindStr :>nul&&(Set OutputDir=%%A&MD "%Output%\!OutputDir:~0,-1!" 2>nul)||Move /Y "%Source%\%%A.*" "%Output%\!OutputDir:~0,-1!" 1>nul
)
EndLocal
chcp 866
|
Уважаемые Знатоки!
Не силен в написании кода, помогите - Вариант 2, из сообщения выше, отлично срабатывал, а теперь при запуске быстро появляется окно cmd и ничего не происходит, дописал в конец кода Pause, но также ничего.
Аналогичный запуск на домашнем компе (операционки идентичные = Windows 10 1607 -64) срабатывает отлично.
Вариант 1 работает криво - из лога берутся куски русских названий после пробела, некоторые вообще не подхватывает((
|
Цитата:
Цитата 4zz
из сообщения выше, отлично срабатывал, а теперь при запуске быстро появляется окно cmd и ничего не происходит, дописал в конец кода Pause, но также ничего. »
|
Запустите окно cmd, а из него уже сам пакетный сценарий.
|
YuS_2,
Странно:
Окно cmd
C:\Users\User>"Desktop\ПАПКИ_АВГ=ПеремОктПостНоя23\по папкам АВГУСТ.bat"
C:\Users\User>chcp 1251
Текущая кодовая страница: 1251
Не удается найти файл C:\Users\User\Log.txt.
Текущая кодовая страница: 866
Значит не понимает %CD%?
Тогда подкладывю лог туда где не может найти - C:\Users\User\Log.txt.
и выдает:
C:\Users\User>"Desktop\ПАПКИ_АВГ=ПеремОктПостНоя23\по папкам АВГУСТ.bat"
C:\Users\User>chcp 1251
Текущая кодовая страница: 1251
Не удается найти указанный файл.
|
Время: 02:57.
© OSzone.net 2001-