Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Автоматизация администрирования. Часть 2

Автор: rosalin
Дата сообщения: 22.09.2008 09:29
Ребята нашел интересный скриптик

Настраиваемый обработчик файлов *
Копирование, перемещение, удаление файлов и *
просто отслеживание наличия в лог согласно *
настроек ini файла.

[more=Сам скрипт]' *******************************************************
' * Find Delete Read Log v.1.0 *
' * 15.08.2006, Polo (C) ГИВЦ *
' * Настраиваемый обработчик файлов *
' * Копирование, перемещение, удаление файлов и *
' * просто отслеживание наличия в лог согласно *
' * настроек ini файла. Написано на WSH 5.6 *
' * Можно применять для резервного копирования, *
' * слежения за наличием и.т.д. *
' *******************************************************

' ###############################################
' ######## START #######
' ###############################################

Dim FSO 'Объект файловая система
Dim WSH 'Объект WScript.Shell
Dim WshNetwork 'Объект сеть.
Dim iniFile 'Объект файла настроек
Dim LogFile 'Объект файла лога
Dim WStr 'Строка для записи в лог
Dim CurrStr 'Обработка текущей строки
Dim newStr 'Формирование новой строки
Dim fParam 'Параметр, читаемый из файла настроек
Dim countSymb 'К-во символов
Dim posSymb 'Позиция текущего символа
Dim currSymb 'Текущий символ
Dim iniFileName 'Файл настроек, имя
Dim SDirs 'Список директорий через ";"
Dim countDirs 'Количество директорий
Dim arrayDir(1024) 'Массив директорий
Dim DestFMove 'Директория, куда перемещать файлы
Dim defAction 'Действие по умолчанию
Dim defMoveMax 'Максимальный размер файла, допустимый для копирования, перемещения
Dim cRuleFiles 'Количество правил по файлам
Dim cRuleFolders 'Количество правил по папкам
Dim RuleFile (1024, 1) 'Правила по файлам, содержание и действие
Dim RuleFolder(1024, 1) 'Правила по папкам, содержание и действие
Dim CountD,CountD1 'Счетчики
Dim CurrExt 'Текущее расширение
Dim CondExt 'Условие расширения
Dim CurrRule 'Текущее правило
Dim strPath, strFile 'Путь и имя файла в процедуре обработки
Dim strFullSource 'Путь источника
Dim strFullDest 'Путь назначения
Dim target_dir, BaseName '
Dim NextFolder, ParmFolder '
Dim CountCopy 'Счетчик скопированных
Dim CountMove 'Счетчик перемещенных
Dim CountDelele 'Счетчик удаленных
Dim CountReport 'Счетчик найденых
Dim CountNothing 'Счетчик проигнорированых
Dim CountErrors 'Счетчик ошибок дейчтвий с файлами
Dim currSizeFile 'Размер текущего файла
Dim allSizeFiles 'Подсчет общего размера файлов в байтах.
Dim logSizeFiles 'Общий размер файлов, с опцией "только обнаружить", т.е. "log"
Dim delSizeFiles 'Общий размер файлов, с опцией "удалить", т.е. "del"
Dim copySizeFiles 'Общий размер файлов, с опцией "копировать", т.е. "copy"
Dim moveSizeFiles 'Общий размер файлов, с опцией "переместить", т.е. "move"
Dim nothingSizeFiles 'Общий размер файлов, с опцией "игнорировать", т.е. "nothing"
Dim currFile 'Объект текущий файл.
Dim ShowEndMessage 'Показ сообщения об окончании работы скрипта.
Dim EndMessage 'Текст сообщения об окончании работы скрипта
Dim SecToWaitEndMessage 'Ожидание в секундах до закрытия окна
Dim LogFileName 'Файл лога
Dim StoreLogFile 'Время хранения лога в днях.
Dim LogFileMode 'Режим ведения лога:
'2 - файл открывается для записи. Содержимое файла,
'которое было до этого, уничтожится;
'8 - файл открывается для добавления данных.
'добавление в конец файла.
Dim NetSendEndMessage 'Отправка сообщения по сети.
Dim NetSendAdress 'Сетевой адрес
Dim EmailEndOfMessage 'Отправка сообщения по почте.
Dim EmailAdress 'Почтовый адрес.
Dim IncLogToEmail 'Вложить лог в почтовое сообщение. 1-да, 0-нет.

' ###############################################
' ######## СТАРТ СКРИПТА #######
' ###############################################

On Error Resume Next

CountCopy = 0
CountMove = 0
CountDelele = 0
CountReport = 0
CountNothing = 0
CountErrors = 0
allSizeFiles = 0
logSizeFiles = 0
delSizeFiles = 0
copySizeFiles = 0
moveSizeFiles = 0
nothingSizeFiles = 0
CountErrors = 0
StoreLogFile = 0
SecToWaitEndMessage = 0
Set WSH = WScript.CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshNetwork = CreateObject("WScript.Network")

'LogFileName = Year(Date())
'wsh.popup LogFileName
'WScript.Quit()
' ###############################################
' ######## СЧИТАЕМ НАСТРОЙКИ ИЗ ФАЙЛА #######
' ###############################################

If Len(Wscript.arguments.Item(0)) < 1 Then
iniFileName = "fdrl.ini" 'ФАЙЛ НАСТРОЕК ПО УМОЛЧАНИЮ
Else
iniFileName = Wscript.arguments.Item(0) 'ФАЙЛ НАСТРОЕК В КАЧЕСТВЕ ПАРАМЕТРА
End If

iniFileName = GetPath & iniFileName

if (FSO.FileExists(iniFileName)) Then
Set iniFile = FSO.OpenTextFile(iniFileName, 1, true)
Else
wsh.popup ("Файл настроек " & iniFileName & " не найден !")
WScript.Quit()
End If

SDirs = GetParam("SDirs")
DestFolderMove = GetParam("DestFolderMove")
defAction = LCase(GetParam("defAction"))
defMoveMax = abs(GetParam("defMoveMax"))
LogFileMode = GetParam("LogFileMode")
StoreLogFile = GetParam("StoreLogFile")
EndMessage = GetParam("EndMessage")
ShowEndMessage = GetParam("ShowEndMessage")
SecToWaitEndMessage = GetParam("SecToWaitEndMessage")
NetSendEndMessage = GetParam("NetSendEndMessage")
NetSendAdress = GetParam("NetSendAdress")
EmailEndOfMessage = GetParam("EmailEndOfMessage")
EmailAdress = GetParam("EmailAdress")
IncLogToEmail = GetParam("IncLogToEmail")

If Err.number <> 0 then
WStr = "Ошибка чтения файла настроек." & CHR(10)
Wstr = Wstr & "Error N" & Err.number & " " & Err.Description & CHR(10)
Wstr = Wstr & "Завершаем работу программы."
WSH.Popup WStr
WScript.Quit()
End If

'LogFileMode = 2 'РЕЖИМ ВЕДЕНИЯ ЛОГА
'НАЗВАНИЕ ФАЙЛА ЛОГА
LogFileName = GetPath & Year(Date()) & "_" & Month(Date()) & "_" & Day(Date()) & "_" & Hour(Time()) & "_" & Minute(Time()) & "_" & FSO.GetBaseName(iniFileName) & ".log"
Set LogFile = FSO.OpenTextFile(LogFileName, LogFileMode, true)
WStr = "*****************************************************"
WSTL(WStr)
WStr = "* Старт работы. WScript версия " & WScript.Version
WSTL(WStr)
WStr = "*****************************************************"
WSTL(WStr)
WStr = "Настройки файла " & iniFileName
WSTL(WStr)
WStr = "SDirs = " & SDirs
WSTL(WStr)
WStr = "DestFolderMove = " & DestFolderMove
WSTL(WStr)
WStr = "defAction = " & defAction
WSTL(WStr)
WStr = "defMoveMax = " & GetFileSize(defMoveMax)
WSTL(WStr)
WStr = "LogFileMode = " & LogFileMode
WSTL(WStr)
WStr = "ShowEndMessage = " & ShowEndMessage
WSTL(WStr)
WStr = "EndMessage = " & EndMessage
WSTL(WStr)
WStr = "SecToWaitEndMessage = " & SecToWaitEndMessage
WSTL(WStr)
WStr = "StoreLogFile = " & StoreLogFile
WSTL(WStr)
WStr = "NetSendEndMessage = " & NetSendEndMessage
WSTL(WStr)
WStr = "NetSendAdress = " & NetSendAdress
WSTL(WStr)
WStr = "EmailEndOfMessage = " & EmailEndOfMessage
WSTL(WStr)
WStr = "EmailAdress = " & EmailAdress
WSTL(WStr)
WStr = "IncLogToEmail = " & IncLogToEmail
WSTL(WStr)

If Err.number <> 0 then
WSTL ("Ошибка в начале работы скрипта.")
WSTL ("Error N" & Err.number & " " & Err.Description )
Err.number = 0
End If

' ###############################################
' ######## ОБРАБОТАЕМ строку точек входа #######
' ###############################################

countSymb = 0
countSymb = Len(SDirs)
posSymb = 1
currSymb = ""
CurrStr = ""
countDirs = 0

Do While countSymb <> 0
currSymb = mid(SDirs,posSymb,1)

if asc(currSymb)= 59 then
countDirs = countDirs + 1
arrayDir(countDirs) =newStr
newStr = ""
WSTL("Точка входа для поиска №" & countDirs & " " & arrayDir(countDirs))
Else
newStr = newStr & currSymb
End if
countSymb = countSymb - 1
posSymb = posSymb + 1
Loop
If Err.number <> 0 then
WSTL ("Ошибка обработки строки директорий поиска 'SDirs='.")
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
End If

WSTL("Итого количество точек входа для поиска = " & countDirs)
WStr = "-----------------------------------------------------"
WSTL(WStr)

' ###############################################
' ###### Читаем правила для файлов и папок #####
' ###############################################
GetRules()
WSTL("Количество правил для файлов: " & cRuleFiles)
WSTL("Количество правил для папок: " & cRuleFolders)


' ###############################################
' ######## Анализ файлов и папок #######
' ###############################################

Do While countDirs <> 0
WStr = "-----------------------------------------------------"
WSTL(WStr)
WSTL("Начинаем анализ " & arrayDir(countDirs))

Call ProcFolder(arrayDir(countDirs))

WSTL("Окончен анализ " & arrayDir(countDirs))
countDirs = countDirs - 1
Loop
allSizeFiles = logSizeFiles + delSizeFiles + copySizeFiles + moveSizeFiles + nothingSizeFiles



WStr = "-----------------------------------------------------"
WSTL(WStr)
WSTL("Результат работы скрипта:")
WSTL("Cкопировано: " & CountCopy & " " & GetFileSize(copySizeFiles))
WSTL("Перемещено: " & CountMove & " " & GetFileSize(moveSizeFiles))
WSTL("Удалено: " & CountDelele & " " & GetFileSize(delSizeFiles))
WSTL("Найдено: " & CountReport & " " & GetFileSize(logSizeFiles))
WSTL("В игноре: " & CountNothing & " " & GetFileSize(nothingSizeFiles))
WSTL("ИТОГО: " & CountNothing + CountReport + CountDelele + CountMove + CountCopy & " " & GetFileSize(allSizeFiles))
WStr = "*****************************************************"
WSTL(WStr)
WSTL("* КОЛИЧЕСТВО ОШИБОК ОБРАБОТКИ ФАЙЛОВ: "& CountErrors & " ошибок.")
WStr = "*****************************************************"
WSTL(WStr)

If ShowEndMessage = 1 Then
WStr = EndMessage
WSTL(WStr)
wsh.Popup WStr, SecondsToWaitMessage, "Скрипт завершил работу: " & Date() & " " & Time(), 0+64
End If

'NetSendEndMessage
'NetSendAdress
If NetSendEndMessage = 1 Then
WStr = "NET SEND " & NetSendAdress & " " & EndMessage
WSH.Run(WStr)
End If
WshShell.LogEvent 0, EndMessage

' *****************************************************
' *****************************************************
' *****************************************************
' ********* НИЖЕ БЛОК ПРОЦЕДУР *********
' *****************************************************
' *****************************************************
' *****************************************************

' ###############################################
' ######## Байты в кило и мега байты #######
' ###############################################
Function GetFileSize(strByte)
GetFileSize=0


'Если мегабайты
If Abs(strByte/(1024*1024)) > 1 Then
GetFileSize = Round(strByte/(1024*1024),3) & " Мб"
Exit Function
end if
'Если килобайты
If Abs(strByte/1024) > 1 Then
GetFileSize = Round(strByte/(1024),3) & " Кб"
Exit Function
end if
GetFileSize = strByte & " байт"
End Function

' ###############################################
' ######## Обработка файлов. #######
' ###############################################
Sub WorkFile(strPath, strFile, strRule)
On Error Resume Next



strFullSource = strPath & "\" & strFile
strFullDest = Mid(strPath, 3,Len(strPath)-3)

Set currFile = FSO.GetFile(strFullSource)
currSizeFile = currFile.Size
'wstl("Владелец: " & currFile.AvailableSpace)
'МОДИФИЦИРУЕМ НАЗВАНИЕ ФАЙЛА ДЛЯ СОБЛЮДЕНИЯ УНИКАЛЬНОСТИ
countSymb = 1
CurrStr = ""

Do While countSymb <= Len(strFullDest)
If Mid(strFullDest,CountSymb,1) = "\" then
CurrStr = CurrStr & "_"
Else
CurrStr = CurrStr + Mid(strFullDest,CountSymb,1)
End If
CountSymb = CountSymb + 1
Loop
CurrStr = CurrStr & "_F_"
strFullDest = DestFolderMove & "\" & CurrStr & strFile

Err.Clear

Select Case StrRule
Case "log"
'ФАКТ ОБНАРУЖЕНИЯ ФАЙЛА В ЛОГ
WSTL ("Обнаружен " & strFullSource & " " & GetFileSize(currSizeFile))
CountReport = CountReport + 1
logSizeFiles = logSizeFiles + currSizeFile
If Err.number <> 0 then
WSTL ("Ошибка отчета по файлу " & strFullSource)
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
CountErrors = CountErrors + 1
End If

Case "copy"
'КОПИРУЕМ ФАЙЛ
if defMoveMax <> 0 and currSizeFile > defMoveMax then
WSTL("Файл " & strFullSource & " имеет размер " & GetFileSize(currSizeFile) & ", копирование отменено." )
exit Sub
else
Call FSO.CopyFile (strFullSource, strFullDest)
End if
If Err.number <> 0 then
WSTL ("Ошибка копирования файла " & strFullSource)
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
CountErrors = CountErrors + 1
End If
WSTL ("Cкопирован " & strFullSource & " в " & strFullDest & " " & GetFileSize(currSizeFile))
CountCopy = CountCopy + 1
copySizeFiles = copySizeFiles + currSizeFile
Case "del"
'УДАЛЯЕМ ФАЙЛ
Call FSO.DeleteFile (strFullSource)
If Err.number <> 0 then
WSTL ("Ошибка удаления файла " & strFullSource)
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
CountErrors = CountErrors + 1
End If
WSTL ("Удален " & strFullSource & " " & GetFileSize(currSizeFile))
CountDelele = CountDelele + 1
delSizeFiles = delSizeFiles + currSizeFile
Case "move"
'ПЕРЕМЕЩАЕМ ФАЙЛ
if defMoveMax <> 0 and currSizeFile > defMoveMax then
WSTL("Файл " & strFullSource & " имеет размер " & GetFileSize(currSizeFile) & ", перенос отменен." )
Exit Sub
Else
Call FSO.MoveFile (strFullSource, strFullDest)
End if
If Err.number <> 0 then
WSTL ("Ошибка копирования файла " & strFullSource)
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
CountErrors = CountErrors + 1
End If
WSTL ("Перемещен файл " & strFullSource & " в " & strFullDest & " " & GetFileSize(currSizeFile))
CountMove = CountMove +1
moveSizeFiles = moveSizeFiles + currSizeFile
Case "nothing"
'Ignore rule
CountNothing = CountNothing + 1
nothingSizeFiles = nothingSizeFiles + currSizeFile
Case Else
WSTL ("Ошибка обработки, " & strFullSource & " правило '" & strRule & "' не найдено")
CountErrors = CountErrors + 1
End Select

End Sub

' ###############################################
' ######## Перебор файлов и папок #######
' ###############################################
Sub ProcFolder(ParmFolder)
On Error Resume Next
BaseName = fso.GetAbsolutePathName(ParmFolder)
If fso.GetFolder(BaseName).Files.Count > 0 Then
For Each NextFile In fso.GetFolder(BaseName).Files
Call ProcFile( ParmFolder, NextFile.Name )
Next
End If
If fso.GetFolder(BaseName).SubFolders.Count > 0 Then
For Each NextFolder In fso.GetFolder(BaseName).SubFolders
Call ProcFolder( NextFolder )
Next
End If
If Err.number <> 0 then
WSTL ("Ошибка обработки директории поиска " & arrayDir(countDirs) )
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
End If
End Sub

' ###############################################
' ######## Анализ файлов и действия #######
' ###############################################
Sub ProcFile(BaseName, filename)
On Error Resume Next
CurrRule = ""
'wstl("File: " & BaseName & "\" & filename)
CurrExt = LCase(FSO.GetExtensionName(filename))

CountD = 1
Do While CountD <= cRuleFiles

'Если ищем по расширению
If left(RuleFile (CountD,0),2) = "*." Then
'Если Расширение совпадает, то проверяем наличие правила на папку и
'запускаем подпрограмму обработки файлов.
CondExt = LCase(FSO.GetExtensionName(RuleFile (CountD,0)))
If CurrExt = CondExt then
CurrRule = RuleFile (CountD,1)
'WSTL ("Найден файл по расширению " & BaseName & "\" & filename & " , " & CurrRule)
'Проверка на правило для папки
If FindFolderRule() <> "" then
CurrRule = FindFolderRule()
'WSTL("Правило изменено на " & currRule)
End If
Call WorkFile(BaseName, filename, currRule)
End If
End If

'Если правило поиска *####*
If left(RuleFile (CountD,0),1) = "*" and Right(RuleFile (CountD,0),1) = "*" Then
'Если найдено совпадение
if Instr(1, filename, Mid(RuleFile(CountD,0), 2, Len(RuleFile (CountD,0))-2)) > 0 Then
CurrRule = RuleFile (CountD,1)
'WSTL ("Найден файл по правилу поиска " & RuleFile (CountD,0) & " , " & BaseName & "\" & filename & " , " & CurrRule)
'Проверка на правило для папки
If FindFolderRule() <> "" then
CurrRule = FindFolderRule()
'WSTL("Правило изменено на " & currRule)
End If
Call WorkFile(BaseName, filename, currRule)
End If
End If

'Если правило поиска *####
If left(RuleFile (CountD,0),2) <> "*." and left(RuleFile (CountD,0),1) = "*" and Right(RuleFile (CountD,0),1) <> "*" Then
'Если соответствует условию
if Mid(RuleFile (CountD,0),2,Len(RuleFile (CountD,0))) = Right(fso.GetBaseName (filename),Len(RuleFile (CountD,0))-1) then
CurrRule = RuleFile (CountD,1)
'WSTL ("Найден файл по правилу поиска " & RuleFile (CountD,0) & " , " & BaseName & "\" & filename & " , " & CurrRule)
'Проверка на правило для папки
If FindFolderRule() <> "" then
CurrRule = FindFolderRule()
'WSTL("Правило изменено на " & currRule)
End If
Call WorkFile(BaseName, filename, currRule)
end if
End If


'Если правило поиска ####*
If Right(RuleFile (CountD,0),1) = "*" and Left(RuleFile (CountD,0),1) <> "*"Then
'Если соответствует условию
if Left(fso.GetBaseName (filename) ,Len(RuleFile (CountD,0))-1) = Left(RuleFile (CountD,0) ,Len(RuleFile (CountD,0))-1) then
CurrRule = RuleFile (CountD,1)
'WSTL ("Найден файл по правилу поиска " & RuleFile (CountD,0) & " , " & BaseName & "\" & filename & " , " & CurrRule)
'Проверка на правило для папки
If FindFolderRule() <> "" then
CurrRule = FindFolderRule()
'WSTL("Правило изменено на " & currRule)
End If
Call WorkFile(BaseName, filename, currRule)
end if
End If
CountD = CountD +1
Loop

If Err.number <> 0 then
WSTL ("Ошибка анализа файлов и действия " )
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
End If
End Sub

' ###############################################
' ######## Ищем правила на папки #######
' ###############################################
Function FindFolderRule()

On Error Resume Next

CountD1 = 1
Do While CountD1 <= cRuleFolders

If LCase(RuleFolder(CountD1,0)) = LCase(BaseName) then
FindFolderRule = RuleFolder (CountD1,1)
Exit Do
End If

If Left(BaseName, Len(RuleFolder(CountD1,0))) & "\" = RuleFolder(CountD1,0) & "\" then
FindFolderRule = RuleFolder (CountD1,1)
Exit Do
end if

FindFolderRule = ""
CountD1 = CountD1 + 1
Loop
If Err.number <> 0 then
WSTL ("Ошибка поиска правил на папки." )
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
End If

End Function

' ###############################################
' ######## Запись в лог #######
' ###############################################
Sub WSTL(WStr)
On Error Resume Next
WStr = "<" & Date() & " " & Time() & "> " & WStr & " "
LogFile.WriteLine(WStr)
If Err.number <> 0 then
WStr = "Не могу вести лог, проверьте" & CHR(10)
Wstr = Wstr & "права на запись в каталог скрипта." & LogFile & CHR(10)
Wstr = Wstr & "Error N" & Err.number & " " & Err.Description & CHR(10)
Wstr = Wstr & "Завершаем работу программы." & CHR(10)
WSH.Popup WStr
WScript.Quit()
End If
End Sub

' ###############################################
' ######## Узнаем каталог скрипта #######
' ###############################################
Function GetPath
Dim path
path = WScript.ScriptFullName
GetPath = Left(path, InStrRev(path, "\"))
End Function

' ###############################################
' ######## Читаем параметр по умолч. #######
' ###############################################
Function GetParam(fParam)
On Error Resume Next
countSymb = Len(fParam)
'iniFile.
Do While Not iniFile.AtEndOfStream
CurrStr = iniFile.ReadLine
if Left(CurrStr, countSymb) = fParam then
GetParam = Mid(CurrStr, countSymb+2, Len(CurrStr))
'wsh.popup fParam & " = " & GetParam
Exit Do
end if
Loop
countSymb = 0
If Err.number <> 0 then
WSTL ("Ошибка чтения параметров по умолчанию." )
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
End If
End Function

' ###############################################
' ######## Читаем правила #######
' ###############################################
Sub GetRules()
On Error Resume Next
cRuleFiles = 0
cRuleFolders = 0

Do While Not iniFile.AtEndOfStream

CurrStr = iniFile.ReadLine
countSymb = Len(CurrStr)
CurrSymb = Left (CurrStr, 5)



Select Case CurrSymb

Case "File="
cRuleFiles = cRuleFiles + 1
posSymb =1
newStr = ""
CurrStr = Mid(CurrStr, 6, countSymb-5)
countSymb = Len(CurrStr)

Do While countSymb <> 0

currSymb = Mid(CurrStr, posSymb , 1)

if currSymb="," then
RuleFile(cRuleFiles,0) = newStr
newStr = ""
Else
newStr = newStr & currSymb
if countSymb = 1 then
If newStr = "default" then
RuleFile(cRuleFiles,1) = defAction
Else
RuleFile(cRuleFiles,1) = LCase(newStr)
End if
end if
End if

countSymb = countSymb - 1
posSymb = posSymb + 1
Loop
WSTL ("Правило для файлов: " & RuleFile(cRuleFiles,0) & " , действие: " & RuleFile(cRuleFiles,1))

Case "Fold="
cRuleFolders = cRuleFolders + 1
posSymb =1
newStr = ""
CurrStr = Mid(CurrStr, 6, countSymb-5)
countSymb = Len(CurrStr)

Do While countSymb <> 0

currSymb = Mid(CurrStr, posSymb , 1)

if currSymb="," then
RuleFolder(cRuleFolders,0) = newStr
newStr = ""
Else
newStr = newStr & currSymb
if countSymb = 1 then
If newStr = "default" then
RuleFolder(cRuleFolders,1) = defAction
Else
RuleFolder(cRuleFolders,1) = LCase(newStr)
End if
end if
End if

countSymb = countSymb - 1
posSymb = posSymb + 1
Loop
WSTL ("Правило для папок: " & RuleFolder(cRuleFolders,0) & " , действие: " & RuleFolder(cRuleFolders,1))

End Select
Loop
If Err.number <> 0 then
WSTL ("Ошибка чтения правил на файлы и папки." )
WSTL ("Error N" & Err.number & " " & Err.Description)
Err.number = 0
End If
End Sub[/more]

[more=Вот .ini]#Пример SDirs=C:\testFDRL;D:\;
#ПУТИ ЧУВСТВИТЕЛЬНЫ К РЕГИСТРУ путь должен оканчиваться на ";"
#Диск должен быть в формате 'C:\;' , путь 'C:\windows;'
SDirs=C:\;

#Папка, куда все сливаем.
DestFolderMove=c:\temp

#Операция по умолчанию.
defAction=move

#Ограничение на макс. размер копируемого или перемещаемого файла в байтах.
defMoveMax=0

#Режим ведения лога, 2 - затирать, 8 - добавлять.
LogFileMode=2
#Сколько дней хранить логи, 0 - не удалять.
StoreLogFile=10

#Текст сообщения об окончании работы скрипта
EndMessage=Поиск и подсчет файлов изображений, музыки и видео в папках C:\testFDRL;C:\testFDRL1.
#Показ сообщения об окончании работы скрипта. 1-да, 0-нет.
ShowEndMessage=0
#Сколько секунд не закрывать окно, 0 - не закрывать.
SecToWaitEndMessage=5
#Отправка сообщения по сети. 1-да, 0-нет. не реализовано
NetSendEndMessage=0
#Сетевой адрес
NetSendAdress=wnr04031
#Отправка сообщения по почте. 1-да, 0-нет. не реализовано
EmailEndOfMessage=0
#Почтовый адрес.
EmailAdress=no@no.no
#Вложить лог в почтовое сообщение. 1-да, 0-нет.
IncLogToEmail=1

# Расшифровка действий с файлами:
# log - только в лог
# copy - копировать
# del - удалять
# move - перемещать
# nothing - игнорировать

File=*.mp3,copy
#File=*.mp4,log
#File=*.avi,log
#File=*.mov,log
#File=*.flv,log
#File=*.bmp,log
#File=*.jpg,log
#File=*.flv,log
#File=*.wmv,log

#ПРАВИЛА НА ФАЙЛЫ В ПАПКАХ (распостраняются на файлы в этих каталогах).
#Fold=U:\System,nothing
#Fold=U:\Hidden,nothing[/more]

а в логе выдает
Antonov_Berega.mp3 правило 'copy ' не найдено
Автор: rosalin
Дата сообщения: 22.09.2008 15:28
впринципе разобрался
Автор: madr1d
Дата сообщения: 25.09.2008 13:20
Народ, помогите советом плиз! Пишу свой первый логон скрипт. Ситуация такая:

Есть расшареный ресурс Links на сервере, в котором лежат подпапки с ярлыками на разные категории ПО. На каждую подпапку даны права только той группе пользователей, которые имеют права работать с данной категорией ПО. Когда пользователь логинится в AD, ему в Главное Меню, в зависимости от принадлежности к группе, копируются ярлыки для запуска определенного ПО.
Соответственно, если у пользователя нет доступа в папку, то ярлыки ему не копируются. Но копируется только пустая папка!! Как сделать так, чтобы пустая папка тоже не копировалась?

кусок скрипта, описывающий копирование одного такого каталога:

dim Path 'путь к папке "главное меню" на компе юзера
Dim fLinks ' Папка с ярлыками на сервере

set WShell = WScript.CreateObject("WScript.Shell")
Path = Wshell.SpecialFolders("StartMenu") & "\"
fLinks="\\dc01\Links\SoftGroup1"

'Копирование папки
CopyFolder DiasoftLinks, Path

Sub CopyFolder (fSource, FDestination)
    On Error Resume Next
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CopyFolder fSource, FDestination, TRUE
End Sub
Автор: cluster
Дата сообщения: 25.09.2008 16:30
Ребят, есть такой
[MORE=скрипт]' Формирует CMD-скрипт для создания ресурсов пользователей в домене

Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCOmmand.ActiveConnection = objConnection
objCommand.CommandText = _
"Select Name, sAMAccountName, Department from 'LDAP://OU=Тест,OU=Предприятие,OU=Холдинг,DC=domain,DC=com' " _
& "where objectCategory='user'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst

WScript.Echo("@echo off")
WScript.Echo("set resourcesRoot=D:\users")
WScript.Echo("mkdir %resourcesRoot%")
WScript.Echo("cd /d %resourcesRoot%")
WScript.Echo("")

Do Until objRecordSet.EOF
WScript.Echo("mkdir "&objRecordSet.Fields("sAMAccountName").Value)
WScript.Echo("CACLS "&objRecordSet.Fields("sAMAccountName").Value&" /E /G DUKAVTO\"&objRecordSet.Fields("sAMAccountName").Value&":F")
WScript.Echo("net share "&objRecordSet.Fields("sAMAccountName").Value&"=%resourcesRoot%\"&objRecordSet.Fields("sAMAccountName").Value&" /grant:все,full /cache:programs")
WScript.Echo("")

objRecordSet.MoveNext
Loop[/MORE]

Как его усовершенствовать, чтобы запускать с параметром, указывающим какую OU сканировать на пользователей? По умолчанию OU=Тест
Автор: dexs
Дата сообщения: 25.09.2008 16:36
Суть задачи , надо disable и переносить юзеров в определёную OU , если юсер неактивен более 60 дней .
Автор: slech
Дата сообщения: 02.10.2008 09:16
всем привет. подскажите как получить дату месяц назад ?
т.е. сегодня первое число, нужно получить первое число прошлого месяца.
сегодня делаем бэкап, нужно затереть бэкап прошлого месяца первого числа.
спасибо.
Автор: abasov
Дата сообщения: 02.10.2008 11:22
cluster

Цитата:
Как его усовершенствовать, чтобы запускать с параметром, указывающим какую OU сканировать на пользователей? По умолчанию OU=Тест


если ты о проверке принадлежности к OU. то есть такая функция:

Код: '====================
asutp = "ou=1Servers"
servers = "ou=2Servers"
'====================
If isMemberOu(asutp) Then
WScript.Quit
elseIf isMemberOu(servers) Then
WScript.Quit
else
end if
===================================
' проверка принадлежности ПК к OU
Private Function isMemberOu(checkOu)
Set objSysInfo = CreateObject("ADSystemInfo")
strComputerDN = objSysInfo.ComputerName
intIndexStart = InStr(LCase(strComputerDN), "ou=")
intIndexLength = InStr(LCase(strComputerDN), ",dc=") - intIndexStart
isMemberOu = false
If intIndexStart > 0 Then
compOu = LCase(Mid(strComputerDN, intIndexStart, intIndexLength))
End If
If InStr(1, compOu, checkOu, 1) Then
isMemberOu = true
END IF
Set objSysInfo = nothing
End Function
Автор: cluster
Дата сообщения: 03.10.2008 10:50
abasov
Нее. По умолчанию скрипт обрабатывает объекты в LDAP://OU=Тест,OU=Предприятие,OU=Холдинг,DC=domain,DC=com

Хочу поместить обрабатываемую OU в переменную и запускать скрипт с параметром:
script.vbs /ou=OU=Холдинг,DC=domain,DC=com
Типа того.
Автор: YNY
Дата сообщения: 06.10.2008 07:48

Цитата:
slech---** как получить дату месяц назад

currdate=Date()
modD=DatePart("d", date) & "," & (DatePart("m", date)-1) & "," & DatePart("yyyy", date)
msgbox currdate &"--|--"& Cdate(modD)
Автор: Gvozdun
Дата сообщения: 06.10.2008 20:58
Всем доброго времени суток! Очень необходима помощь! Появилась такая необходимость удалить со всех компов домена симантек. С консоли не удается, нашел здесь скрипт удаляющий программу по ее IdentifyingNumber.

'Удаление программы

'Этим скриптом можно удалить любую установленную через Windows Installer программу. В этом примере её имя LeftSoft Program.

'strComputer = "."-для локального компьютера для остальных меняем на имя компа
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colSoftware = objWMIService.ExecQuery _
("Select * from Win32_Product Where IdentifyingNumber='{446DBFFA-4088-48E3-8932-74316BA4CAE4}'")

For Each objSoftware in colSoftware
objSoftware.Uninstall()
Next

Только вот, как сделать чтоб имя компьютера не вручную для каждой машины прописывать, а чтоб скрипт сам проверял имя компа и вставлял уже в нужное поле.
Буду безмерно благодарен за помощь...заранее спасибо!
Автор: BorlandIMHO
Дата сообщения: 06.10.2008 23:42
Gvozdun
Где-то так...
process.cmd

Код: @echo off
REM complist.lst - текстовый файл с именами компьютеров, 1строка=1 имя
FOR /F %%N IN (complist.lst) DO (
REM Формируем построчно персональный скрипт для компа
copy nul process.vbs
echo 'Удаление программы >>process.vbs
echo.>>process.vbs
echo 'Этим скриптом можно удалить любую установленную через Windows Installer программу. В этом примере её имя LeftSoft Program. >>process.vbs
echo. >>process.vbs
echo 'strComputer = "."-для локального компьютера для остальных меняем на имя компа
echo strComputer = "%%N" >>process.vbs
echo Set objWMIService = GetObject("winmgmts:" _ >>process.vbs
echo & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") >>process.vbs
echo. >>process.vbs
echo Set colSoftware = objWMIService.ExecQuery _ >>process.vbs
echo ("Select * from Win32_Product Where IdentifyingNumber='{446DBFFA-4088-48E3-8932-74316BA4CAE4}'") >>process.vbs
echo.
echo For Each objSoftware in colSoftware >>process.vbs
echo objSoftware.Uninstall() >>process.vbs
echo Next >>process.vbs
echo. >>process.vbs

REM Запускаем скрипт и ждём его завершения
start /w cscript.exe process.vbs
)
Автор: YNY
Дата сообщения: 07.10.2008 05:00

Цитата:
Gvozdun

Строчка strComputer = "." означает, что если скрипт запускается на данной, а не другой машине, то имя само ставится нужное.
Иными словами если эт скрипт в логон для всех компов прописать, то соотв никакова имени компа писать не надо, надо только чтоб скрипт выполнялся с необходимыми правами!


Добавлено:
Приведенный BorlandIMHO пример имеет сиысл использовать если ты скрипт будешь запускать со своего компа, а не прописывать его в логон (и с правами все равно прийдется разбираться, а для этого см страницы ранее).


Добавлено:

Цитата:
BorlandIMHO

Ну ты приколист, у тя че все скрипты так формируются и запускаются: ты делаешь 2-ю работу т.к. ты не пишешь скрипт, а формируешь его из другова???
Автор: XINSIDE
Дата сообщения: 07.10.2008 15:42
Привествую.
Подскажите есть утилита psexec.exe.
Мне необходимо, с её помощью, выполнять команды на удалённой машине. Интересует следующее - работает ли она в рабочей группе, нет домена. Есть пароль локального админа. Не могу достучаться до компа. Говорит - couldn't access.
Если psexec.exe не работает в рабочей группе посоветуйте как ещё можно запускать консольные улититы на удалённой машине. Какими программными средствами, чтобы человек нажимал ярлык на bat файл или на скрипт и на удалённой машине выполнялась определённая команда. Всё это не в домене, а в рабочей группе.

Добавлено:
Приветствую.
Подскажите есть утилита psexec.exe.
Мне необходимо, с её помощью, выполнять команды на удалённой машине. Интересует следующее - работает ли она в рабочей группе, нет домена. Есть пароль локального админа. Не могу достучаться до компа. Говорит - couldn't access.
Если psexec.exe не работает в рабочей группе посоветуйте как ещё можно запускать консольные улититы на удалённой машине. Какими программными средствами, чтобы человек нажимал ярлык на bat файл или на скрипт и на удалённой машине выполнялась определённая команда. Всё это не в домене, а в рабочей группе.
Автор: abasov
Дата сообщения: 08.10.2008 05:34
XINSIDE

Цитата:
Подскажите есть утилита psexec.exe.
Мне необходимо, с её помощью, выполнять команды на удалённой машине. Интересует следующее - работает ли она в рабочей группе, нет домена. Есть пароль локального админа. Не могу достучаться до компа. Говорит - couldn't access.
Если psexec.exe не работает в рабочей группе посоветуйте как ещё можно запускать консольные улититы на удалённой машине. Какими программными средствами, чтобы человек нажимал ярлык на bat файл или на скрипт и на удалённой машине выполнялась определённая команда. Всё это не в домене, а в рабочей группе.


set comp=PC1
psexec \\%comp% -u %comp%\admin -p password cscript.exe \\fs.loc.net\distr\Upload\word.vbs

Автор: phaoost
Дата сообщения: 10.10.2008 00:10
подскажите, можно ли установить статус сервиса в manual из коммндной строки? т.е. есть disabled сервис, нужно его стартануть.
Автор: abasov
Дата сообщения: 10.10.2008 05:45
phaoost

Цитата:
подскажите, можно ли установить статус сервиса в manual из коммндной строки? т.е. есть disabled сервис, нужно его стартануть.

sc config
Автор: phaoost
Дата сообщения: 10.10.2008 12:25
abasov
спасибо, только вот что-то routing and remote access не могу найти как называется там

Добавлено:
ой, нашёл. просто там синтаксис странный
Автор: Fader
Дата сообщения: 10.10.2008 17:29
Видел проскакивал здесь вопрос: как изменить имя соединения по локальной сети.

Нашел решение:

Код:
strComputer = "."
NewName="NewName"
set wshShell= wscript.CreateObject("Wscript.Shell")
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\microsoft\homenet")
Set colItems = objWMIService.ExecQuery("Select * from HNet_Connection")
For Each objItem in colItems
if (objItem.IsLANConnection) then
wshShell.Run("netsh interface set interface name = " &chr(34)&objItem.Name &chr(34)& " newname = " & chr(34)&NewName&chr(34))
end if
Next
Автор: vicwanderer
Дата сообщения: 10.10.2008 18:43
Бэкап w2k3 средствами ntbackup по след. схеме. Как сделать?
System state 1 раз в неделю
Срок хранения: бэкап за последние 4 недели
Бэкап файлов+1С(dbf)
1 раз в неделю
тип: full(в выходные) + increment(ежедневно)
Срок хранения: 6 последних полных бэкапа

Если ставить ежедневный normal бэкап, то бэкап за 2-ую неделю затрёт
бэкап за первую неделю. Ну и по инкрементным тоже самое.
А хотелось бы видеть на внешнем винчестере
System_state-week1.bkf
System_state-week2.bkf
System_state-week3.bkf
System_state-week4.bkf
Files-week1.bkf
Files-week2.bkf
...
Files-week6.bkf
Files-inc1.bkf
...
Files-inc6.bkf
Автор: BorlandIMHO
Дата сообщения: 10.10.2008 21:25

Цитата:
Ну ты приколист, у тя че все скрипты так формируются и запускаются: ты делаешь 2-ю работу т.к. ты не пишешь скрипт, а формируешь его из другова???
Вообще-то нет...
Я конкретно объяснил, как запускать один и тот же wsh-скрипт для разных машин.
Поскольку сам я wsh не использую, то пошёл "по пути наименьшего сопротивления". Догадываюсь, что скрипт может принимать параметр из командной строки, тогда можно один и тот же скрипт запускать с параметром ИмяКомпа. Просто лень разбираться с параметрами...
А вариант мой вполне работоспособен - во всяком случае, не менее чем исходный скрипт.

Цитата:
с правами все равно прийдется разбираться
Ну, насколько я понимаю, скрипт запускается доменным админом со своими правами. И если у доменного админа не хватает прав на рабочих станциях - гнать нужно такого админа...
А с правами как раз придётся разбираться при прописывании скрипта во входной...

Автор: Fader
Дата сообщения: 13.10.2008 11:10

Цитата:
strComputer = "."
NewName="NewName"
set wshShell= wscript.CreateObject("Wscript.Shell")
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\microsoft\homenet")
Set colItems = objWMIService.ExecQuery("Select * from HNet_Connection")
For Each objItem in colItems
if (objItem.IsLANConnection) then
wshShell.Run("netsh interface set interface name = " &chr(34)&objItem.Name &chr(34)& " newname = " & chr(34)&NewName&chr(34))
end if
Next


Хотелось бы внести ясность: к сожалению скрипт в качестве исходного имени соединения воспринимает только лишь дефолтное.
Автор: zzxx1488
Дата сообщения: 14.10.2008 08:33
hi all
есть скрипт восстанавливающий таблицу рутинга по ip'шникам из файла \defgw, мне нужно чтобы добавились все ip кроме первого в обратном порядке, пытаюсь сделать так, но что-то не выходит
добавляются все ip с первого по пятый, включая первый, который не нужен

Set fsoWSH = CreateObject("Wscript.Shell")
Set fsoFCO = CreateObject("Scripting.FileSystemObject")
Set fsoGFF = fsoFCO.GetFolder(".")
Set fsoTXT = fsoFCO.OpenTextFile(fsoGFF.Path & "\defgw")
Do Until fsoTXT.AtEndOfStream
m = Split(fsoTXT.Readline)
a.Run "route ADD 0.0.0.0 MASK 0.0.0.0 " & m([5 - 1])
Loop
Автор: YNY
Дата сообщения: 15.10.2008 05:10

Цитата:
zzxx1488

uses the Split function to return an array from a string), а это значит что при помощи
Readline ты читаешь сторки от начала файла, пока не достигнешь его конца и, непонятно зачем, каждую строку ты переарганизуешь в массив размерности 4)
если тебе надо пропустить какую-то сторку то
ns=0
Do....
ns=ns+1
if ns=<нужное> then '- тут мы берем только нужный набор строк из файла
m = Split(fsoTXT.Readline)
a.Run "route ADD 0.0.0.0 MASK 0.0.0.0 " & m
end if
' ns=ns+1 --или тут-как те удобней )
Loop

Добавлено:
или попробуй вот эти методы
Skips a specified number of characters when reading a TextStream file.
object.Skip(characters)
characters-- количиство символов которрое надо пропустить от текущей позиции.

Skips the next line when reading a TextStream file.
f.SkipLine -- просто пропускает одну линию от текущей позиции
Автор: PIL123
Дата сообщения: 15.10.2008 16:13
Коллеги, выручайте. Нужно решить дурацкую задачу: через шедулер каждый день проверять некую папочку и всё её содержимое старше 3-х дней - удалять. Помогите наваять такой скрипт, пожалуйста.
Автор: abasov
Дата сообщения: 15.10.2008 20:02
PIL123

Цитата:
Коллеги, выручайте. Нужно решить дурацкую задачу: через шедулер каждый день проверять некую папочку и всё её содержимое старше 3-х дней - удалять. Помогите наваять такой скрипт, пожалуйста.

вам кажется ответили здесь, еще решение надо?
http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=4004386&SiteID=40
Автор: qrock
Дата сообщения: 16.10.2008 14:01

Цитата:
Коллеги, выручайте. Нужно решить дурацкую задачу: через шедулер каждый день проверять некую папочку и всё её содержимое старше 3-х дней - удалять. Помогите наваять такой скрипт, пожалуйста.


forfiles.exe спасет отца русской демократии
Автор: gbcfkf
Дата сообщения: 17.10.2008 07:04
Добрый день.. никак не могу выудить информацию о пользователях в AD:
VBS скрипт:

On error resume next
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCOmmand.ActiveConnection = objConnection
objCommand.CommandText = "Select Name from 'LDAP://ou=ou1,dc=mydomen,DC=ru' " & "where objectClass='computer'"
objCommand.Properties("Page Size") = 5000
objCommand.Properties("Timeout") = 10
objCommand.Properties("Searchscope") = 5
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
strUser = objRecordSet.Fields("name").Value
WScript.Echo struser
objRecordSet.MoveNext
Loop

^Так работает.

Но никак не выуживаются другие атрибуты например, что перечислены здесь - выходят пустые строки.
Также не работает такая конструкция:
objCommand.CommandText = "Select * from 'LDAP://ou=ou1,dc=mydomen,DC=ru' " & "where objectClass='computer' , хотя должна
Ниче не понимаю.. где собака зарыта?


ps Я не совсем прав, когда сказал, что ни один атрибут не выводится. Нормально выводятся атрибуты: ADsPath, Name, samAccountName и mail
Автор: rosalin
Дата сообщения: 20.10.2008 12:25
Ребята подскажите скрипт проверки и подключения нескольких сетевых принтеров для компьютера невходящего в домен но зная пароль администратора...
Автор: Starley25
Дата сообщения: 23.10.2008 19:49
Господа!
Просьба имеется. Никто не поможет в написании скрипта по такой вот задачке. Необходимо с одного компа проверять скажем наличие некоего файла на другом, причем с измерением времени выполнения проверки (для оценки работы сетевого оборудовани), ну или копирование некоего файла на другой комп (посоянного, то есть если этот файл уже есть, то его удаляем и поверх записываем тот же) с измерением времени выполнения.

С уважением Starley25.
Автор: cluster
Дата сообщения: 23.10.2008 22:14
gbcfkf
а какие аттрибуты тебе ещё нужны? перечисли. завтра попробую на работе. отпишусь.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576

Предыдущая тема: BackUp Win2003Serer


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.