Войти

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


skuzi
31-01-2017, 20:50
Есть папка с 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
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
alpap, данный способ не работает, окно долго висит, потом пропадает, но ничего никуда не копирует

sov44
01-02-2017, 11:00
skuzi, поменяйте в 4 строке %%b на %%a

sov44
01-02-2017, 11:18
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
sov44, этот батник наоборот создает папки с именем до #, то есть папку 11983247, а не папку UPRO

sov44
01-02-2017, 15:17
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
данный способ не работает »
здрассьте!
распаковал ваш архив на рабочий стол, там же bat (у меня в кодировке 866, но это не должно влиять, вообще поиск цифр идет), все имена оригинальные - ваши и они же используются в коде и при этом у меня все работает
143142

Iska
04-02-2017, 06:41
Пусть будет и на 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




© OSzone.net 2001-2012