Показать полную графическую версию : Раскидать xml файлы по папкам в зависимости от содержимого
Есть папка с 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 в прилагаемом архиве
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
alpap, данный способ не работает, окно долго висит, потом пропадает, но ничего никуда не копирует
skuzi, поменяйте в 4 строке %%b на %%a
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
п.с. батник и файлы д.б. в одной директории.
sov44, этот батник наоборот создает папки с именем до #, то есть папку 11983247, а не папку UPRO
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
данный способ не работает »
здрассьте!
распаковал ваш архив на рабочий стол, там же bat (у меня в кодировке 866, но это не должно влиять, вообще поиск цифр идет), все имена оригинальные - ваши и они же используются в коде и при этом у меня все работает
143142
Пусть будет и на 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.