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

Mushroomhead 20-07-2014 10:20 2378756

Сортировка файлов взависимости от содержимого
 
Всем привет, уважаемые форумчане! С bat знаком постольку-поскольку, но возникла необходимость его применения. Буду благодарен, если поможете решить одну задачку!
Смысл такой: допустим, что в папку C:\in падает большое кол-во файлов *.xml в кодировке Windows-1251. В каждом из таких файлов есть строка, содержащая номер счёта, типа "НомСч="66000011112222333344"". Необходимо разделить все эти файлы на две папки C:\in\1 и C:\in\2, в зависимости от значения номера счёта.
в C:\in\1 попадают - все счета, начинающиеся на 7788, 40 (исключение 408)
в C:\in\2 попадают - все счета, начинающиеся на 6677, 408

Пытался что-то набросать, но возникали проблемы с кодировками и ещё с чем-то :sorry: ...

Код:

@echo off
setlocal enableextensions
set src=C:\in\
set in1=C:\in\1
set in2=C:\in\2
if not exist "%in1%" md "%in1%"
if not exist "%in2%" md "%in2%"
for /F "delims=" %%A IN ('findstr /M /C:".*НомСч=\"6677.*" "%src%\*.*"') DO copy "%%~A" "%in2%"
for /F "delims=" %%A IN ('findstr /M /C:".*НомСч=\"408.*" "%src%\*.*"') DO copy "%%~A" "%in2%"
pause


Iska 20-07-2014 13:11 2378838

Цитата:

Цитата Mushroomhead
В каждом из таких файлов есть строка, »

Такая строка — единственная?

Цитата:

Цитата Mushroomhead
…счета, начинающиеся на 7788, 40 (исключение 408)
…счета, начинающиеся на 6677, 408 »

Выложите образцы/примеры xml-файлов, упакованных в архив. Для охвата всех условий.

Mushroomhead 20-07-2014 15:04 2378882

Вложений: 1
Прикрепляю архив с двумя файлами-примерами. Т.К. речь идёт об отчётных документах банка, предварительно обезличил информацию в них...

Iska 21-07-2014 08:21 2379158

Mushroomhead, вот Вам примерная болванка на WSH:
читать дальше »
Код:

Option Explicit

Dim strSourceFolder

Dim objRegExp
Dim dictPatternsAndDestFolders

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemEventSource
Dim objSWbemObjectEx

Dim strDestFolder


strSourceFolder = "C:\in"

Set objRegExp                  = WScript.CreateObject("VBScript.RegExp")
Set dictPatternsAndDestFolders = WScript.CreateObject("Scripting.Dictionary")

With dictPatternsAndDestFolders
        .Add "^(6677|408)\d*$",    "C:\in\1"
        .Add "^(7788|40[^8])\d*$", "C:\in\2"
End With


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _
        "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
        "TargetInstance ISA 'CIM_DirectoryContainsFile' AND " & _
        "TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & Replace(strSourceFolder, "\", "\\\\") & """'" _
)


WScript.Echo "Monitor files creation in [" & strSourceFolder & "]..."

Do
        With objSWbemServicesEx.Get(objSWbemEventSource.NextEvent.TargetInstance.PartComponent)
                WScript.Echo Now() & " | < | New file:    [" & .Name & "]"
               
                Select Case LCase(.Extension)
                        Case "xml"
                                strDestFolder = TestAndGetDestFolder(.Name)
                               
                                If Not IsEmpty(strDestFolder) Then
                                        If .Copy(strDestFolder & "\" & .FileName & "." & .Extension) = 0 Then
                                                WScript.Echo Now() & " | > | Copy into:  [" & strDestFolder & "]"
                                        Else
                                                WScript.Echo Now() & " | ! | Can't copy into: [" & strDestFolder & "]"
                                        End If
                                End If
                        Case Else
                                ' Nothing to do
                End Select
               
                If .Delete() = 0 Then
                        WScript.Echo Now() & " | v | Delete file: [" & .Name & "]"
                Else
                        WScript.Echo Now() & " | ! | Can't delete file: [" & .Name & "]"
                End If
        End With
Loop

WScript.Quit 0
'=============================================================================

'=============================================================================
Function TestAndGetDestFolder(strFileName)
        Dim strPattern
       
        TestAndGetDestFolder = Empty
       
        With WScript.CreateObject("Msxml2.DOMDocument")
                If .load(strFileName) Then
                        With .selectSingleNode("/Файл/Документ/СвСчет/@НомСч")
                                For Each strPattern In dictPatternsAndDestFolders.Keys
                                        objRegExp.Pattern = strPattern
                                       
                                        If objRegExp.Test(.nodeValue) Then
                                                TestAndGetDestFolder = dictPatternsAndDestFolders.Item(strPattern)
                                               
                                                Exit For
                                        End If
                                Next
                        End With
                Else
                        WScript.Echo "Can't load xml content from [" & strFileName & "]."
                End If
        End With
End Function
'=============================================================================


Запускать под «cscript.exe».

Mushroomhead 21-07-2014 14:09 2379298

Блин! Спасибо, конечно. Вы просто титаническую работу проделали для моей задачи! Но у меня было пожелание сделать именно на bat. В нём бы я хоть что-то мог понять =))
Ваш скрипт попытался использовать, но он просто удаляет файлы, поступившие на вход. Пишет "Can't load xml content from..."

Iska 21-07-2014 16:43 2379361

Mushroomhead, проверьте на тех файлах, что Вы выложили в архиве — на них работает?

Georgio 26-07-2014 18:49 2381648

Цитата:

Цитата Mushroomhead
Но у меня было пожелание сделать именно на bat. В нём бы я хоть что-то мог понять =)) »

Код:

@echo off
setlocal enableextensions

set "src=C:\in"
set "in1=%src%\1"
set "in2=%src%\2"

if not exist "%in1%" md "%in1%"
if not exist "%in2%" md "%in2%"

(
echo НомСч="7788
echo НомСч="40[^8]
)>.tmp
for /f "delims=" %%A in ('findstr /mrg:.tmp "%src%\*.xml"') do copy "%%~A" "%in1%">nul

(
echo НомСч="6677
echo НомСч="408
)>.tmp
for /f "delims=" %%A in ('findstr /mg:.tmp "%src%\*.xml"') do copy "%%~A" "%in2%">nul

del .tmp
endlocal
exit /b



Время: 06:12.

Время: 06:12.
© OSzone.net 2001-