Компьютерный форум 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=269624)

surrender1 09-10-2013 17:35 2231489

перемещение файлов в каталог созданный из части имени файла
 
Добрый день. Помогите пожалуйста с написанием батника, который бы выполнял следующее:
в определенной папке существуют файлы (количество не постоянное и может быть большим) с различными расширениями, такими как 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 2231650

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

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

surrender1 10-10-2013 08:11 2231781

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

Iska 10-10-2013 10:45 2231865

Цитата:

Цитата surrender1
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 2231874

Цитата:

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

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

surrender1 10-10-2013 11:48 2231895

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

Iska 10-10-2013 12:12 2231905

Цитата:

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

Конечно. Тогда можно будет обойтись и простым пакетным файлом. Нужен?

Цитата:

Цитата surrender1
Еще один момент, если впервые создается каталог с именем адреса электронной почты, то необходимо, что бы в этом каталоге создался каталог "отправленные" (для архивирования). »

Добавьте:
Код:

objFSO.CreateFolder objFSO.BuildPath(strNewFolder, "отправленные")
после:
Код:

objFSO.CreateFolder strNewFolder

surrender1 10-10-2013 12:21 2231913

Цитата:

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

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

Iska 10-10-2013 13:10 2231943

Цитата:

Цитата surrender1
можно что нибудь придумать? »

Можно:
читать дальше »
Код:

@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 2232011

Спасибо. Выручил!


Время: 17:37.

Время: 17:37.
© OSzone.net 2001-