Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] переместить файлы по папкам согласно списку (http://forum.oszone.net/showthread.php?t=179433)

shadowbat 29-06-2010 21:27 1444037

переместить файлы по папкам согласно списку
 
имеются файлы:
Иванов Иван Иванович_1.*
Иванов Иван Иванович_2.*
Петров Петр Петрович.*
Сидоров Сидр Сидорович.*
...

нужно раскидать их по папкам (условие распределения берется из txt файла)
txt с условием (заполняет пользователь):
Код:

Самара:
Иванов Иван Иванович_1
Сидоров Сидр Сидорович

Москва:
Иванов Иван Иванович_2
Петров Петр Петрович

т.е. cmd перемещает Иванов Иван Иванович_1.* и Сидоров Сидр Сидорович.* в папку "Самара"
а Иванов Иван Иванович_2.* и Петров Петр Петрович.* в папку "Москва"

как такое реализовать через CMD/BAT с использованием CurrentDir?

shadowbat 29-06-2010 22:18 1444061

Цитата:

Цитата deepred
А почему с использованием CD?

CD - это currentdir? имеется ввиду чтобы BAT/CMD работал с текущей папкой, в которой сам находится, чтобы не писать лишний раз папку для работы

Цитата:

Цитата deepred
вид файла именно такой, т.е. заголовки с городами могут менять место?

не понял вопроса. список городов произвольный, задается пользователем. т.е. может быть и 1 и 5 городов

Цитата:

Цитата deepred
города конечно же могут быть любые?

именно те, которые пользователь напишет в txt-файле, такие папки и создавать

deepred 30-06-2010 00:29 1444153

Вот такая штука вышла...

Обновил код....

Код:


@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 нужен для перезаписывания файлов в целевом каталоге без запроса

shadowbat 30-06-2010 01:44 1444203

хм..
1й вариант с русскими именами и двумя вариантами текста батника из-за странной кучи пробелов в строчке 23-24 перед "goto"


2й вариант с английскими именами и с удаленным chcp 1251


в обоих случаях папки не создаются

deepred 30-06-2010 10:45 1444344

Хм...

То что приведено у тебя в блокноте не верно..., действительно странные пробелы, местами отсутствуют символы "$" и "\". Команды 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


shadowbat 30-06-2010 14:11 1444514

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


4zz 17-11-2023 10:05 3020094

Уважаемые Знатоки!
Не силен в написании кода, помогите - Вариант 2, из сообщения выше, отлично срабатывал, а теперь при запуске быстро появляется окно cmd и ничего не происходит, дописал в конец кода Pause, но также ничего.
Аналогичный запуск на домашнем компе (операционки идентичные = Windows 10 1607 -64) срабатывает отлично.
Вариант 1 работает криво - из лога берутся куски русских названий после пробела, некоторые вообще не подхватывает((

YuS_2 17-11-2023 10:47 3020098

Цитата:

Цитата 4zz
из сообщения выше, отлично срабатывал, а теперь при запуске быстро появляется окно cmd и ничего не происходит, дописал в конец кода Pause, но также ничего. »

Запустите окно cmd, а из него уже сам пакетный сценарий.

4zz 17-11-2023 14:51 3020118

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.

Время: 02:57.
© OSzone.net 2001-