Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Раскидать xml файлы по папкам в зависимости от содержимого

Ответить
Настройки темы
CMD/BAT - Раскидать xml файлы по папкам в зависимости от содержимого

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar sso.rar
(7.6 Kb, 7 просмотров)
Есть папка с 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 в прилагаемом архиве

Отправлено: 20:50, 31-01-2017

 

Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


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

Отправлено: 03:13, 01-02-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:21, 01-02-2017 | #3


Ветеран


Сообщения: 2196
Благодарности: 727

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:00, 01-02-2017 | #4


Ветеран


Сообщения: 2196
Благодарности: 727

Профиль | Отправить PM | Цитировать


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
п.с. батник и файлы д.б. в одной директории.

Отправлено: 11:18, 01-02-2017 | #5


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:56, 01-02-2017 | #6


Ветеран


Сообщения: 2196
Благодарности: 727

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:17, 01-02-2017 | #7


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось alpap, 07-12-2017 в 15:07.


Отправлено: 02:25, 02-02-2017 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Пусть будет и на 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

Отправлено: 06:41, 04-02-2017 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Раскидать xml файлы по папкам в зависимости от содержимого

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Раскидать файлы по папкам согласно дате в имени файла spkvvs Скриптовые языки администрирования Windows 17 24-01-2024 16:03
CMD/BAT - [решено] Раскидать картинки по папкам kingdeathart Скриптовые языки администрирования Windows 2 06-02-2016 16:02
CMD/BAT - [решено] Раскидать файлы по папкам Denn1982 Скриптовые языки администрирования Windows 1 08-07-2012 11:43
CMD/BAT - [решено] Раскидывание фалов по папкам в зависимости от расширения fashit Скриптовые языки администрирования Windows 4 23-01-2012 16:10
Разное - EXCEL. Цвет ячеек в зависимости от содержимого jeilous Microsoft Office (Word, Excel, Outlook и т.д.) 1 09-09-2011 14:07




 
Переход