1

Тема: VBScript: копирование с USB в папку на компьютере, с проверками

Попросили помочь в написании скрипта, а я сам не особо в этом шарю. Задача такова:
Определить, изменялась ли заданная пользователем папка за последний месяц. Если нет, скопировать в нее файлы со съемного носителя. Проверить наличие съемного носителя, вывести список имеющихся на ней файлов и  удостовериться, что на рабочем диске достаточно места.  Создать файл, записав туда тип диска, с которого выполнялось копирование и его метку. Файлу присвоить атрибут «Скрытый».
Порылся по форуму, почитал немного литературу, и слепил такого Франкенштейна.


strTarget = Trim(InputBox("set path to copy"))
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
Set tFolder = fso.GetFolder(strTarget)
Set sDrive = fso.GetDrive(strSource)
Set sFolder = fso.GetFolder(strSource)   ' флешка-источник

If Age>30 Then
	Set lDrive = tFolder.Drive.DriveLetter  ' получаем диск папки назначения
	Set uDrive = sDrive.DriveLetter ' получаем диск папки-источника
	drFree = (FormatNumber(lDrive.AvailableSpace/1024, 0) - (FormatNumber(uDrive.TotalSize/1024, 0) - FormatNumber(uDrive.AvailableSpace/1024, 0)) - 1024)
	If drFree > 0 Then
	usbDrive
	sFolder.Copy tFolder
	Else
	WScript.Echo("Not enough space on destination drive")
	End If
	WScript.Echo("Destination folder was in use in last 30 days")
End If

'======================================
Function Age(tFolder)
	Age = DateDiff("d", tFolder.DateLasModified, Now())
End Function

'======================================
Sub usbDrive
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
	"TargetInstance ISA 'Win32_LogicalDisk'" & _
	" AND TargetInstance.DriveType = 2")
	Set objReceivedEvent = objEvents.NextEvent
	Set strSource = objReceivedEvent.TargetInstance.Name
	Set Folder = fso.GetFolder(strSource)
	For Each File In Folder.Files
	WScript.Echo File.Name
	Set logLine = "VolumeType:" & objReceivedEvent.TargetInstance.DriveType & VbCrLf & _
	"VolumeName: " & objReceivedEvent.TargetInstance.VolumeName
	Set Folder = FSO.GetFolder(strTarget)
	Set TextStream = Folder.CreateTextFile("log.txt")
	TextStream.WriteLine logLine
	TextStream.Close
	set logFile = fso.GetFile(strTarget & "log.txt") ' как получить только что созданный файл, чтобы назначить ему атрибут?
	logFile.Attributes = 2
End Sub

Теперь вопросы по порядку:
1. Проверка последнего использования папки в функции Age, скрипт нашёл на форуме, по идее проблем быть не должно;
2. Проверка наличия свободного места. Что думаете по этому поводу?
3. Проверка наличия съёмного носителя, находил на форуме, вроде вставил правильно. Но есть сомнения.
4. С записью в текстовый файл информации о флешке вроде не должно быть, но вот как затем его сделать скрытым...
5. Ну и собственно организовать копирование. Корректно ли я его сделал.
Ну и при запуске выдаёт ошибку на последней строке. Ошибка: предполагается наличие инструкций

2

Re: VBScript: копирование с USB в папку на компьютере, с проверками

На какой строке ошибка? (указано в сообщении)

3 (изменено: EugeneBY, 2017-11-12 22:06:58)

Re: VBScript: копирование с USB в папку на компьютере, с проверками

AlexanderG В последней строке, где End Sub

Post's attachments

Clip2net_171112210526.png
Clip2net_171112210526.png 15.17 kb, 1 downloads since 2017-11-12 

You don't have the permssions to download the attachments of this post.

4

Re: VBScript: копирование с USB в папку на компьютере, с проверками

Проверить возможности нет, но помоему не закрыт цикл FOR в процедуре.

5

Re: VBScript: копирование с USB в папку на компьютере, с проверками

Не хватает инструкции "NEXT" (скорее всего строкой перед "End Sub").

6

Re: VBScript: копирование с USB в папку на компьютере, с проверками

AlexanderG Спасибо, закрыл цикл, вставил NEXT. Теперь ошибка на строке №5. Я понимаю, что strSource ещё неизвестна, но как её объявить в начале? И из процедуры usbDrive пробовал кусок кода между 4 и 5 вставить, с 28 по 34 строки, так другую ошибку выдаёт. Попробую ещё сам в литературе покопаться, рекомемндовали Гюнтера Борна, "Руководство разработчика на Microsoft Windows Script Host 2.0. Мастер-класс". Но по отдельности каждая операция вроде и понятна, а вот как это грамотно слепить в единое целое, пока не могу дойти.


strTarget = Trim(InputBox("set path to copy"))
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
Set tFolder = fso.GetFolder(strTarget)
Set sDrive = fso.GetDrive(strSource)
Set sFolder = fso.GetFolder(strSource)   ' флешка-источник

If Age>30 Then
	Set lDrive = tFolder.Drive.DriveLetter  ' получаем диск папки назначения
	Set uDrive = sDrive.DriveLetter ' получаем диск папки-источника
	drFree = (FormatNumber(lDrive.AvailableSpace/1024, 0) - (FormatNumber(uDrive.TotalSize/1024, 0) - FormatNumber(uDrive.AvailableSpace/1024, 0)) - 1024)
	If drFree > 0 Then
	usbDrive
	sFolder.Copy tFolder
	Else
	WScript.Echo("Not enough space on destination drive")
	End If
	WScript.Echo("Destination folder was in use in last 30 days")
End If

'======================================
Function Age(tFolder)
	Age = DateDiff("d", tFolder.DateLasModified, Now())
End Function

'======================================
Sub usbDrive
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
	"TargetInstance ISA 'Win32_LogicalDisk'" & _
	" AND TargetInstance.DriveType = 2")
	Set objReceivedEvent = objEvents.NextEvent
	Set strSource = objReceivedEvent.TargetInstance.Name
	Set Folder = fso.GetFolder(strSource)
	For Each File In Folder.Files
	Do While True
	WScript.Echo File.Name
	Set logLine = "VolumeType:" & objReceivedEvent.TargetInstance.DriveType & VbCrLf & _
	"VolumeName: " & objReceivedEvent.TargetInstance.VolumeName
	Set Folder = FSO.GetFolder(strTarget)
	Set TextStream = Folder.CreateTextFile("log.txt")
	TextStream.WriteLine logLine
	TextStream.Close
	set logFile = fso.GetFile(strTarget & "log.txt") ' как получить только что созданный файл, чтобы назначить ему атрибут?
	logFile.Attributes = 2
	Loop
	Next
End Sub

Ну и рекомендовали ещё для проверки свободного местазаписать If .AvailableSpace > [bytes], хотя это не учитывает объём флешки и объём копируемых файлов. Ну и раз нужно искать только USB-флеш-накопители, то проще смотреть по if sDrive.DriveType = 1 And sDrive.IsReady. Если нужна конкретная флешка, то — по if sDrive.SerialNumber = [№] And sDrive.IsReady. Попробую реализовать.

7

Re: VBScript: копирование с USB в папку на компьютере, с проверками

Задайте все необходимые переменные (диск-источник и папку назаначения) в самом начале скрипта и проверьте.