Имя пользователя:
Пароль:
 | Правила  

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

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

Аватара для Mushroomhead

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


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

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


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

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

Код: Выделить весь код
@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

Отправлено: 10:20, 20-07-2014

 

Ветеран


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

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


Цитата Mushroomhead:
В каждом из таких файлов есть строка, »
Такая строка — единственная?

Цитата Mushroomhead:
…счета, начинающиеся на 7788, 40 (исключение 408)
…счета, начинающиеся на 6677, 408 »
Выложите образцы/примеры xml-файлов, упакованных в архив. Для охвата всех условий.

Отправлено: 13:11, 20-07-2014 | #2



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

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


Аватара для Mushroomhead

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


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

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


Вложения
Тип файла: zip Primer.zip
(2.0 Kb, 13 просмотров)

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

Отправлено: 15:04, 20-07-2014 | #3


Ветеран


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

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


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».
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:21, 21-07-2014 | #4


Аватара для Mushroomhead

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


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

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


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

Отправлено: 14:09, 21-07-2014 | #5


Ветеран


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

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


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

Отправлено: 16:43, 21-07-2014 | #6


Ветеран


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

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


Цитата 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

Отправлено: 18:49, 26-07-2014 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Сбрасывается сортировка файлов Atamiq Microsoft Windows 8 и 8.1 3 25-06-2014 16:37
Разное - сортировка файлов в библиотеках kekeke-kun Microsoft Windows 7 3 16-07-2012 01:24
Любой язык - Копирование текстовых файлов в зависимости от их содержимого Brigadir_33 Скриптовые языки администрирования Windows 1 28-02-2012 08:02
CMD/BAT - [решено] Сортировка файлов с учетом содержимого Grammaton Cleric Скриптовые языки администрирования Windows 1 16-11-2011 08:43
CMD/BAT - Сортировка файлов kt626 Скриптовые языки администрирования Windows 2 28-03-2009 10:47




 
Переход