Войти

Показать полную графическую версию : перемещение файлов в каталог созданный из части имени файла


surrender1
09-10-2013, 17:35
Добрый день. Помогите пожалуйста с написанием батника, который бы выполнял следующее:
в определенной папке существуют файлы (количество не постоянное и может быть большим) с различными расширениями, такими как doc, jpg, png и т.д. Имя состоит из адреса электронной почты слитно с именем и фамилией человека. Например:

petya@mail.ruПупкин Петя.jpg
petya@mail.ruПупкина Аня.jpg
vasya@mail.ruПетров Вася.doc
........
ivanov@mail.comИванов Алексей.png

По умолчанию между адресом почты и фамилией нет пробела, но если критично, то пробел можно вставить, но удобнее было бы так как есть.
Существует каталог, пусть будет d:\какаятопапка.
Так вот, нужен батник который бы в каталоге d:\какаятопапка создал каталог (если такого еще не имеется) с именем адреса электронной почты и поместил в него файл, с исключением из имени файла адреса электронной почты, если такой каталог имеется, то просто переместить в него файл, опять таки с исключением из имени файла адреса электронной почты.
Т.е. файл *\petya@mail.ruПупкин Петя.jpg стал файлом d:\какаятопапка\petya@mail.ru\Пупкин Петя.jpg

Iska
09-10-2013, 22:09
surrender1, главная проблема — как выделить адреса. В связи с этим три вопроса:

1) перечислите все возможные корневые домены Ваших адресов электронной почты: «.ru», «.com» и т.д.;
2) фамилия/имя всегда на русском или может быть и латиница?
3) укажите Вашу ОС.

surrender1
10-10-2013, 08:11
1. На данный момент имеються ru, com, co.cc, но могут быть любые.
2. Ну на английском пока не встречалось, но может быть и такое.
3. XP, может быть когда ни будь server 2003.

Iska
10-10-2013, 10:45
1. На данный момент имеються ru, com, co.cc, но могут быть любые.
2. Ну на английском пока не встречалось, но может быть и такое. »
В таком случае, я не представляю себе, каким образом можно будет гарантированно распознать конец корневого домена и начало имени. Пока что можно, например, так, на WSH (если у кого-нибудь, особо, гм, продвинутого, нет домена «.рф»):
Option Explicit

Dim strSourceFolder 'в определенной папке
Dim strDestFolder 'Существует каталог, пусть будет d:\какаятопапка.
Dim strNewFolder 'создал каталог (если такого еще не имеется) с именем адреса электронной почты

Dim objFSO
Dim objFile


strSourceFolder = "E:\Песочница\0324"
strDestFolder = "d:\какаятопапка"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strSourceFolder) Then
If objFSO.FolderExists(strDestFolder) Then
With WScript.CreateObject("VBScript.RegExp")
.Pattern = "^(.+@.+?)([А-Яа-я ]+\..*)$"

For Each objFile In objFSO.GetFolder(strSourceFolder).Files
If .Test(objFile.Name) Then
With .Execute(objFile.Name)
strNewFolder = objFSO.BuildPath(strDestFolder, .Item(0).Submatches(0))

If Not objFSO.FolderExists(strNewFolder) Then
objFSO.CreateFolder strNewFolder
End If

objFile.Name = .Item(0).Submatches(1)
objFile.Move strNewFolder & "\"
End With
End If
Next
End With
Else
WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
End If
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
End If

Set objFSO = Nothing

WScript.Quit 0

surrender1
10-10-2013, 11:11
Цитата surrender1:
1. На данный момент имеються ru, com, co.cc, но могут быть любые.
2. Ну на английском пока не встречалось, но может быть и такое. »
В таком случае, я не представляю себе, каким образом можно будет гарантированно распознать конец корневого домена и начало имени. Пока что можно, например, так, на WSH (если у кого-нибудь, особо, гм, продвинутого, нет домена «.рф»): »

Корневой домен зависит от пользователей, на данный момент существуют пользователи со стандартными ru и com (ну и не стандартный co.cc), и с именами и фамилиями на русском языке. Как будет дальше, кто его знает...
За скрипт спасибо огромнейшее!
Существует возможность имя файлов формировать с пробелом между е-мылом и фамилией именем. Тогда наверное можно разделять по первому пробелу. Такое ведь возможно?

surrender1
10-10-2013, 11:48
Еще один момент, если впервые создается каталог с именем адреса электронной почты, то необходимо, что бы в этом каталоге создался каталог "отправленные" (для архивирования).

Iska
10-10-2013, 12:12
Существует возможность имя файлов формировать с пробелом между е-мылом и фамилией именем. Тогда наверное можно разделять по первому пробелу. Такое ведь возможно? »
Конечно. Тогда можно будет обойтись и простым пакетным файлом. Нужен?

Еще один момент, если впервые создается каталог с именем адреса электронной почты, то необходимо, что бы в этом каталоге создался каталог "отправленные" (для архивирования). »
Добавьте:
objFSO.CreateFolder objFSO.BuildPath(strNewFolder, "отправленные")
после:
objFSO.CreateFolder strNewFolder

surrender1
10-10-2013, 12:21
Цитата surrender1:
Существует возможность имя файлов формировать с пробелом между е-мылом и фамилией именем. Тогда наверное можно разделять по первому пробелу. Такое ведь возможно? »
Конечно. Тогда можно будет обойтись и простым пакетным файлом. Нужен?
Цитата surrender1:
Еще один момент, если впервые создается каталог с именем адреса электронной почты, то необходимо, что бы в этом каталоге создался каталог "отправленные" (для архивирования). »
Добавьте:
Код:
objFSO.CreateFolder objFSO.BuildPath(strNewFolder, "отправленные")
после:
Код:
objFSO.CreateFolder strNewFolder »

Спасибо. что то наподобие я уже сам написал )) только с добавлением еще одной переменной.
А на счет "Существует возможность имя файлов формировать с пробелом между е-мылом и фамилией именем. Тогда наверное можно разделять по первому пробелу. Такое ведь возможно?" можно что нибудь придумать?

Iska
10-10-2013, 13:10
можно что нибудь придумать? »
Можно:
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=C:\Песочница\034
set sDestFolder=d:\какаятопапка

if exist "%sSourceFolder%\." (
pushd "%sSourceFolder%"

if exist "%sDestFolder%\." (
for /f "usebackq tokens=1* delims= " %%i in (`dir /b /a:-d /o:n "*@*.*"`) do (
set sNewFolder=%sDestFolder%\%%~i
if not exist "!sNewFolder!\." md "!sNewFolder!"
if not exist "!sNewFolder!\отправленные\." md "!sNewFolder!\отправленные"
>nul copy /y "%%~i %%~j" "!sNewFolder!\%%~j"
del /f /q "%%~i %%~j"
)
) else (
echo Can't find destination folder [%sDestFolder%].
)

popd
) else (
echo Can't find source folder [%sSourceFolder%].
)

endlocal
exit /b 0

surrender1
10-10-2013, 14:42
Спасибо. Выручил!




© OSzone.net 2001-2012