В один из дней была поставлена задача архивировать все подключенные флешки на специальную флешку с резервными копиями. Поиск по интернетам ничего нужного не дал, поскольку требовалось максимально простое и эффективное решение.
Задача поставлена не совсем обычная — хотелось получить архив с каждой подключенной флешки на архивной флешке при минимальном действии пользователя. Поиск по гуглам привёл в сторону скрипта на VBS и архиватора WinRAR. CMDBAT для данной задачи не подходят, поскольку необходимо работать с файловой системой и списком устройств, что легко позволяет делать VBS. Выбор в сторону WinRAR был сделан из-за того, что он обладает очень широкими настройками через командную строку. Поисковые запросы выдают много примеров и мануалов, где расписаны параметры запуска архиватора и примеры их использования, но все пути там статичны, а флешки иногда могут менять свои пути. Поэтому необходимо получить список съёмных устройств, исключить из него устройства без носителей (например пустой карт-ридер). После того, как получаем коллекцию дисков мы пробегаемся по ней и если съёмный носитель не является архивной флешкой, то архивируем с заданными параметрами в заданное место. По окончании работы скрипта также выводиться информация о количестве архивированных флешек.
После написания скрипт и папка с WinRAR закидываются в корень архивной флешки, устанавливается разрешение только на чтение и выполнение и скрываются от глаз пользователя, а для запуска выводится ярлык.
В конце поста приводится собственно скрипт на VBS и некоторые параметры запуска WinRAR. Скрипт ориентирован на начинающих системных администраторов и небольшие объёмы данных.
Option Explicit
Const Removable = 1
Dim AN, FN, LN, flag, text, path, Letter
Dim fso, oDrive, curDrive
Dim WshShell
Dim RarPlace, RarName, RarList
flag = 0
Letter = ""
text = ""
path = ""
AN =""
FN = ""
LN = ""
Set fso = wscript.createobject("scripting.FileSystemObject")
Set oDrive = fso.Drives
Set WshShell = CreateObject("WScript.Shell")
AN = WshShell.CurrentDirectory ' Поскольку скрипт лежит в корне, то достаточно получить директорию запуска
For Each curDrive In oDrive ' Получаем коллекцию носителей
Select Case curDrive.DriveType
Case Removable ' Выбираем съёмные устройства и начинаем их проверять
If curDrive.IsReady Then ' Проверка на наличие носителя в устройстве
path = curDrive.DriveLetter & ":"
If (path <> AN) Then
LN = curDrive.VolumeName
If Not fso.FolderExists(AN & LN) Then FSO.CreateFolder AN & LN ' Создаём и выбираем место складирования архивов
RarList = path
RarName = AN & LN & "" & LN & "-" & ".rar"
RarPlace = AN & "WinRARWinRAR.exe a -s -r -rr10p -idcdpq -htb -dh -isnd -ed -m3 -idp -agYYYYMMDD" ' Параметры запуска архиватора
WshShell.Run ( "" & RarPlace & " " & RarName & " " & RarList)
flag = flag + 1
Letter = Letter & curDrive.DriveLetter & ":" & VbTab & curDrive.VolumeName & VbCrLf ' Метка и имя тома для вывода информации о заархивированных флешках
Else
flag = flag
End If
End If
End Select
Next
' Подсчёт и вывод на экран количества заархивированных флешек с их именем и путём
If (flag = 0) Then
text = "Флешки для архивации отсутствуют"
Else If (flag = 1) Then
text = "Заархивировано:" & VbTab & flag & " флешка"
Else If (flag < 5 and flag > 0) Then
text = "Заархивировано:" & VbTab & flag & " флешки"
Else If (flag >= 5) Then
text = "Заархивировано:" & VbTab & flag & " флешек"
End If
End If
End If
End If
MsgBox text & VbCrlf & VbCrlf & Letter