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

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

skuzi 31-01-2017 20:50 2707821

Раскидать xml файлы по папкам в зависимости от содержимого
 
Вложений: 1
Есть папка с 100+ xml файлами определенной структуры. И есть txt файл с такими строками:
11983247#UPRO
12007438#UPRO
24014125#UPRO
12001482#utor
96438959#utor
23997705560002#usxa
14317798#umtc
7567499#UMTC
62530665#usxa
57277613#usxa
55604374#umtc
43075037#utor
24038094#umtc

Задача в том, чтобы bat-ник анализировал этот txt и раскладывал xml файлы по папкам следующим образом:
если в xml файле значение поля okpo равно цифрам до #, то файл нужно переместить в папку, название которой после #.
То есть если в папке есть xml со значением поля okpo равным 11983247 то этот xml нужно переместить в папку UPRO и так далее.

xml файлы и txt в прилагаемом архиве

alpap 01-02-2017 03:13 2707882

skuzi,
если уж так сильно надо на cmd (потому что не для него задача), сработает и это, если закрыть глаза на возможное (ну очень маловероятно) совпадение искомого числа в другой строке (не поля okpo) файла, про скорость можете забыть естественно:
Код:

@echo off
<"raz.txt" (for /f "tokens=1* delims=#" %%a in ('more') do (
  for /f "delims=" %%c in ('findstr /mc:"%%a" "*.xml"') do (
  if not exist "%%b" (md "%%b")& >nul copy /y "%%c" "%%b\"
  )
 )
)
exit


skuzi 01-02-2017 09:21 2707917

alpap, данный способ не работает, окно долго висит, потом пропадает, но ничего никуда не копирует

sov44 01-02-2017 11:00 2707946

skuzi, поменяйте в 4 строке %%b на %%a

sov44 01-02-2017 11:18 2707954

skuzi, если значение okpo не случайно в имени *.xml, то можно и так
Код:

@echo off
for /f "tokens=1* delims=#" %%a in ('type raz.txt') do (
for /f "delims=" %%b in ('dir /b /a-d "*.xml" ^|find "%%a"') do (
if not exist "%%a" (md "%%a")& >nul copy /y "%%b" "%%a\"
))
pause
exit

п.с. батник и файлы д.б. в одной директории.

skuzi 01-02-2017 14:56 2708024

sov44, этот батник наоборот создает папки с именем до #, то есть папку 11983247, а не папку UPRO

sov44 01-02-2017 15:17 2708030

skuzi, тогда так
Код:

@echo off
<"raz.txt" (for /f "tokens=1-2 delims=#" %%a in ('more') do (
  for /f "delims=" %%c in ('findstr /mc:"%%a" "*.xml"') do (
  if not exist "%%b" (md "%%b")& >nul copy /y "%%c" "%%b\"
  )
 )
)
exit

или так
Код:

@echo off
for /f "tokens=1-2 delims=#" %%a in ('type raz.txt') do (
for /f "delims=" %%c in ('dir /b /a-d "*.xml" ^|find "%%a"') do (
if not exist "%%b" (md "%%b")& >nul copy /y "%%c" "%%b\"
))
pause
exit


alpap 02-02-2017 02:25 2708193

Цитата:

Цитата skuzi
данный способ не работает »

здрассьте!
распаковал ваш архив на рабочий стол, там же bat (у меня в кодировке 866, но это не должно влиять, вообще поиск цифр идет), все имена оригинальные - ваши и они же используются в коде и при этом у меня все работает
Файл 143142

Iska 04-02-2017 06:41 2708818

Пусть будет и на WSH:
Скрытый текст
Код:

Option Explicit

Dim strSourceFolder
Dim strPatternFile

Dim objFSO
Dim objFile

Dim objDictionary

Dim strLine
Dim arrParts

Dim strKey
Dim strDestFolder


strSourceFolder = "C:\Мои проекты\0040\sso"
strPatternFile  = "C:\Мои проекты\0040\sso\raz.txt"

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

If objFSO.FolderExists(strSourceFolder) Then
        If objFSO.FileExists(strPatternFile) Then
                Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
               
                With objFSO.OpenTextFile(strPatternFile)
                        Do Until .AtEndOfStream
                                strLine = Trim(.ReadLine())
                               
                                If InStr(strLine, "#") > 0 Then
                                        arrParts = Split(strLine, "#")
                                       
                                        If Not objDictionary.Exists(arrParts(0)) Then
                                                objDictionary.Add arrParts(0), arrParts(1)
                                        Else
                                                objDictionary.Item(arrParts(0)) = arrParts(1)
                                        End If
                                End If
                        Loop
                       
                        .Close
                End With
               
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        If StrComp(objFSO.GetExtensionName(objFile.Name), "xml", vbTextCompare) = 0 Then
                                WScript.Echo objFile.Name
                               
                                With WScript.CreateObject("Microsoft.XMLDOM")
                                        .load(objFile.Path)
                                        strKey = .selectSingleNode("/report/title/item[@name='okpo']").GetAttribute("value")
                                End With
                               
                                If objDictionary.Exists(strKey) Then
                                        strDestFolder = objDictionary.Item(strKey)
                                       
                                        If Not objFSO.FolderExists(strDestFolder) Then
                                                objFSO.CreateFolder strDestFolder
                                        End If
                                       
                                        If Not objFSO.FileExists(objFSO.BuildPath(strDestFolder, objFile.Name)) Then
                                                WScript.Echo vbTab, "Move into [" & strDestFolder & "\]"
                                                objFile.Move strDestFolder & "\"
                                        Else
                                                WScript.Echo vbTab, "Can't move: destination file [" & objFSO.BuildPath(strDestFolder, objFile.Name) & "] already exists."
                                        End If
                                End If
                        End If
                Next
               
                objDictionary.RemoveAll
                Set objDictionary = Nothing
        Else
                WScript.Echo "Can't find pattern file [" & strPatternFile & "]."
                WScript.Quit 2
        End If
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0



Время: 15:10.

Время: 15:10.
© OSzone.net 2001-