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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Перемещение файлов. Условие поиск слова в файле.

Ответить
Настройки темы
VBS/WSH/JS - [решено] Перемещение файлов. Условие поиск слова в файле.

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


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

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


Изменения
Автор: Hixi
Дата: 30-05-2013
Помогите решить задачу на VBS.
Нужно найти определенный текст в текстовых файлах находящихся в одной директории.
При совпадении с определенным текстом переносить в указанный путь.

Если в файле найден текст "QWERTY" , то перенести этот файл в C:\QWERTY\"текущая дата"
Если в файле найден текст "ASDFGР" , то перенести этот файл в C:\ASDFGР\"текущая дата"
и т.д.

Необходимая задача уже решалась когда-то на CMD/BAT http://forum.oszone.net/nextnewesttothread-242495.html

Отправлено: 18:23, 30-05-2013

 

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


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

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


Цитата Iska:
"год", "месяц", "год_месяц_день" — это, я так понял, шаблоны? В которые при обработке должны подставляться значения текущей даты? »
В идеале да.

Отправлено: 02:35, 01-06-2013 | #11



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

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


Ветеран


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

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


Аппетит растёт во время еды? Это, в принципе, возможно. При большом желании можно даже внедрить поддержку функций вида «вчерашний день» и т.п.

Однако, поскольку в WSH крайне ограниченная реализация форматирования даты/времени:
Цитата:
vbGeneralDate 0 Display a date and/or time. If there is a date part, display it as a short date. If there is a time part, display it as a long time. If present, both parts are displayed.

vbLongDate 1 Display a date using the long date format specified in your computer's regional settings.

vbShortDate 2 Display a date using the short date format specified in your computer's regional settings.

vbLongTime 3 Display a time using the time format specified in your computer's regional settings.

vbShortTime 4 Display a time using the 24-hour format (hh:mm).
— большого желания делать свою реализацию я не испытываю.


1. Какие шаблоны Вы хотите использовать — перечислите?
2. Какова будет кодировка текстового файла с парами «"Фраза для поиска"="Путь для перемещения"»?

Отправлено: 08:06, 01-06-2013 | #12


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


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

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


1. Шаблон нужен исключительно краткий. (C:\qwer\Привет\2013\05\2013_05_31). В некоторых случаях перенос файла, при совпадении с найденым текстом, должен осуществляться в предшествующую дату. В остальных необходимости нет.
2. Кодировка пойдет любая (на ваше усмотрение). Для удобства ввода пойдет windows-1251 или cp866.

Отправлено: 00:00, 02-06-2013 | #13


Ветеран


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

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


Цитата Hixi:
1. Шаблон нужен исключительно краткий. »
Это три формата/функции: год, месяц, дата в нестандартном формате.

В общем, держите:
читать дальше »
Код: Выделить весь код
Option Explicit

Dim strIniFile

Dim objDictionary
Dim objRegExp
Dim objRegExp4Eval
Dim objMatchCollection

Dim strLine
Dim strParameter
Dim strValue

Dim strSourceFolder

Dim objFile

Dim strText
Dim strPhrase

Dim strDate
Dim strDestPath


If WScript.Arguments.Count = 1 Then
	With WScript.CreateObject("Scripting.FileSystemObject")
		strIniFile = WScript.Arguments.Item(0)
		
		If .FileExists(strIniFile) Then
			Set objDictionary  = WScript.CreateObject("Scripting.Dictionary")
			Set objRegExp      = WScript.CreateObject("VBScript.RegExp")
			Set objRegExp4Eval = WScript.CreateObject("VBScript.RegExp")
			
			objRegExp.Pattern      = "^\s*("")?([^\1=]+?)\1\s*=\s*("")?(.+?)\3\s*$"
			objRegExp4Eval.Pattern = "(\?)([^\?]+?)\1"
			
			strSourceFolder = WScript.CreateObject("WScript.Shell").CurrentDirectory
			
			WScript.Echo "Ini file: [" & strIniFile & "]"
			WScript.Echo "--------------------------------------------"
			
			With .OpenTextFile(strIniFile)
				Do Until .AtEndOfStream
					strLine = .ReadLine()
					
					If objRegExp.Test(strLine) Then
						Set objMatchCollection = objRegExp.Execute(strLine)
						
						strParameter = objMatchCollection.Item(0).SubMatches(1)
						strValue     = objMatchCollection.Item(0).SubMatches(3)
						
						Do While objRegExp4Eval.Test(strValue)
							strValue = objRegExp4Eval.Replace(strValue, Eval(objRegExp4Eval.Execute(strValue).Item(0).Submatches.Item(1)))
						Loop
						
						WScript.Echo "Parameter: [" & strParameter & "]"
						WScript.Echo "Value:     [" & strValue & "]"
						WScript.Echo
					Else
						WScript.Echo "Can't determine line [" & strLine & "]"
					End If
					
					If Not objDictionary.Exists(strParameter) Then
						objDictionary.Add strParameter, strValue
					Else
						WScript.Echo "Duplicate parameter [" & strParameter & "] found"
					End If
				Loop
				
				.Close
			End With
			
			WScript.Echo
			WScript.Echo "Source folder: [" & strSourceFolder & "]"
			WScript.Echo "--------------------------------------------"
			
			For Each objFile In .GetFolder(strSourceFolder).Files
				If LCase(.GetExtensionName(objFile.Name)) = "txt" Then
					WScript.Echo "File: " & objFile.Path
					
					With objFile.OpenAsTextStream()
						strText = StrConvert(.ReadAll(), "windows-1251", "cp866")
						.Close
					End With
					
					For Each strPhrase In objDictionary.Keys
						If InStr(1, strText, strPhrase, vbTextCompare) > 0 Then
							WScript.Echo Space(4) & "Phrase found: " & strPhrase
							
							strDestPath = objDictionary.Item(strPhrase)
							
							CreateFolderEx strDestPath
							objFile.Move .BuildPath(strDestPath, "\")
							
							WScript.Echo Space(4) & "Moved to folder [" & strDestPath & "]"
						End If
					Next
				End If
			Next
			
			objDictionary.RemoveAll
			
			Set objRegExp     = Nothing
			Set objDictionary = Nothing
		Else
			WScript.Echo "Can't find ini file [" & strIniFile & "]"
		End If
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <ini file>"
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub CreateFolderEx(strPath)
	With WScript.CreateObject("Scripting.FileSystemObject")
		If Not .FolderExists(strPath) Then
			CreateFolderEx .GetParentFolderName(strPath)
			.CreateFolder strPath
		End If
	End With
End Sub
'=============================================================================

'=============================================================================
' HKEY_CLASSES_ROOT\MIME\Database\Charset
' cp866, windows-1251, koi8-r, unicode, utf-8, _autodetect
'=============================================================================
Function StrConvert(ByVal strText, ByVal strSourceCharset, ByVal strDestCharset)
	Const adTypeText      = 2
	Const adModeReadWrite = 3
	
	
	With WScript.CreateObject("ADODB.Stream")
		.Type      = adTypeText
		.Mode      = adModeReadWrite
		
		.Open
		
		.Charset   = strSourceCharset
		.WriteText strText
		
		.Position  = 0
		.Charset   = strDestCharset
		StrConvert = .ReadText
		
		.Close
	End With
End Function
'=============================================================================

и играйтесь.

Вызов:
Код: Выделить весь код
cscript.exe //nologo "Script.vbs" "Путь\ini-файл"
Внутри ini-файла можно указывать выражения на VBScript, обрамляя их символами «?» — лепите, что пожелаете. Пробельные символы обрезаются, если потребны — обрамляйте кавычками. Кодировка ini-файла — «windows-1251».

Пример ini-файла, на основе приведённых Вами данных:
Код: Выделить весь код
Родина = C:\try\?CStr(Year(Now()))?\?Right("00" & CStr(Month(Now())), 2)?\?CStr(Year(Now())) & "_" & Right("00" & CStr(Month(Now())), 2) & "_" & Right("00" & CStr(Day(Now())), 2)?\прием
Горы = E:\asd\?CStr(Year(DateAdd("d", -1, Now())))?\?Right("00" & CStr(Month(DateAdd("d", -1, Now()))), 2)?\?CStr(Year(DateAdd("d", -1, Now()))) & "_" & Right("00" & CStr(Month(DateAdd("d", -1, Now()))), 2) & "_" & Right("00" & CStr(Day(DateAdd("d", -1, Now()))), 2)?\прием
Привет = D:\789
Тополь-М = F:\14\тру
Возможный результат:
читать дальше »
Код: Выделить весь код
Ini file: [0001.ini]
--------------------------------------------
Parameter: [Родина]
Value:     [C:\try\2013\06\2013_06_03\прием]

Parameter: [Горы]
Value:     [E:\asd\2013\06\2013_06_02\прием]

Parameter: [Привет]
Value:     [D:\789]

Parameter: [Тополь-М]
Value:     [F:\14\тру]


Source folder: [E:\Песочница\0267]
--------------------------------------------
File: E:\Песочница\0267\0001.txt
File: E:\Песочница\0267\0002.txt
File: E:\Песочница\0267\0003.txt
File: E:\Песочница\0267\0004.txt
    Phrase found: Горы
    Moved to folder [E:\asd\2013\06\2013_06_02\прием]
File: E:\Песочница\0267\0005.txt
    Phrase found: Родина
    Moved to folder [C:\try\2013\06\2013_06_03\прием]

***** script completed - exit code: 0 *****
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:06, 03-06-2013 | #14


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


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

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


Спасибо! Все работает как надо!)

Отправлено: 22:05, 04-06-2013 | #15



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Перемещение файлов. Условие поиск слова в файле.

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] CMD Перемещение файлов. Условие поиск слова в файле xsanekk Скриптовые языки администрирования Windows 2 12-09-2012 16:49
CMD/BAT - Смена слова в нужном файле. Wookie-Altai Скриптовые языки администрирования Windows 0 02-06-2012 18:23
Поиск слова в txt затем поиск по маске "(383)" и вывод инфы rustoss AutoIt 10 29-09-2011 15:27
CMD/BAT - [решено] Условие с применением поиска в файле Starter1 Скриптовые языки администрирования Windows 3 22-06-2011 18:18
CMD/BAT - [решено] Поиск файлов и перемещение каталога djvall Скриптовые языки администрирования Windows 3 04-02-2011 09:32




 
Переход