Создание архива

Тема в разделе "Visual Basic 6 / Сценарии VBScript, JScript", создана пользователем mike 1, 5 мар 2016.

  1. mike 1
    Оффлайн

    mike 1 Активный пользователь

    Сообщения:
    2.468
    Симпатии:
    863
    Всем привет. Хотел спросить у других, возможно ли это сделать с помощью штатных средств Windows и без использования сторонних программ? Задача стоит такая: нужно создать архив с паролем, но важно чтобы использовались только встроенные утилиты Windows (желательно через командную строку). Использование консольных архиваторов не годится. Я после долгих поисков смог найти только этот VBS скрипт, но так и не понял можно ли задать пароль с помощью него?

    Код (vb.net):
    ' ZIP.VBS manipulates ZIP file in command line.
    ' Usage: CScript.exe ZIP.VBS [-d|-e|-v] ZIPfile [files...]
    '    CScript.exe ZIP.VBS -a archive.zip 1.txt

    Option Explicit
    Dim arg
    Dim optind

    If WScript.Arguments.Count<1 Then
    WScript.Echo "Usage: CScript.exe ZIP.VBS [-d|-e|-v] ZIPfile [files...]"
    WScript.Quit
    End If
    arg=WScript.Arguments(optind)
    Select Case LCase(arg)
    Case "-a","-c"
    optind=optind+1
    Call MakeZIP()
    Case "-d"
    optind=optind+1
    Call DeleteZIP()
    Case "-e"
    optind=optind+1
    Call ExtractZIP()
    Case "-v","-l"
    optind=optind+1
    Call ListZIP()
    Case Else
    If optind=WScript.Arguments.Count-1 Then
    Call ListZIP()
    Else
    Call MakeZIP()
    End If
    End Select
    WScript.Quit

    Sub MakeZIP()
    Dim fso
    Dim wShell
    Dim Shell
    Dim n
    Dim ie
    Dim ZIPfile
    Dim ZIPdata:ZIPdata="PK" & Chr(5) & Chr(6) & String(18,0)
    Dim file
    Dim Folder
    Dim FolderItem
    Dim dFolder

    If WScript.Arguments.Count<optind+2 Then
    WScript.Echo "Arguments Missing."
    WScript.Quit
    End If

    Set fso=CreateObject("Scripting.FileSystemObject")
    Set wShell=CreateObject("WScript.Shell")

    Set Shell=CreateObject("Shell.Application")
    For n=0 To 9
    For Each ie In Shell.Windows
    If Not ie.Busy Then
      If ie.ReadyState=4 Then
       If InStr(TypeName(ie.Document),"IShellFolderViewDual")=1 Then
        Exit For
       End If
      End If
    End If
    Next
    If Not IsEmpty(ie) Then Exit For
    If n=0 Then CreateObject("WScript.Shell").Run "explorer.exe",0,True
    WScript.Sleep 100
    Next
    If IsEmpty(ie) Then
    WScript.Echo "Failed"
    WScript.Quit
    End If
    Set Shell=ie.Document.Application

    ZIPfile=fso.GetAbsolutePathName(WScript.Arguments(optind))
    If UCase(fso.GetExtensionName(ZIPfile))<>"ZIP" Then
    WScript.Echo "Invalid Extension Name -",fso.GetExtensionName(ZIPfile)
    WScript.Quit
    End If
    If Not fso.FileExists(ZIPfile) Then
    fso.CreateTextFile(ZIPfile,False).Write ZIPdata
    End If
    Set dFolder=Shell.NameSpace(ZIPfile)
    For optind=optind+1 To WScript.Arguments.Count-1
    file=fso.GetAbsolutePathName(WScript.Arguments(optind))
    Set Folder=Shell.NameSpace(fso.GetParentFolderName(file))
    Set FolderItem=Folder.ParseName(fso.GetFileName(file))
    If FolderItem Is Nothing Then
    WScript.Echo WScript.Arguments(optind),"- Not Found."
    WScript.Quit
    End If
    dFolder.CopyHere FolderItem
    Next
    End Sub

    Sub ListZIP()
    Dim fso
    Dim Shell
    Dim ZIPfile
    Dim Folder
    Dim FolderItem
    Dim k
    Dim COL:COL=8
    Dim cols
    ReDim cols(COL)
    Dim rows
    Dim j

    If WScript.Arguments.Count<optind+1 Then
    WScript.Echo "Arguments Missing."
    WScript.Quit
    End If

    Set fso=CreateObject("Scripting.FileSystemObject")
    Set Shell=CreateObject("Shell.Application")
    ZIPfile=fso.GetAbsolutePathName(WScript.Arguments(optind))
    If UCase(fso.GetExtensionName(ZIPfile))<>"ZIP" Then
    WScript.Echo "Invalid Extension Name -",fso.GetExtensionName(ZIPfile)
    WScript.Quit
    End If
    Set Folder=Shell.NameSpace(ZIPfile)
    ReDim rows(Folder.Items.Count)
    For k=0 To COL
    cols(k)=Folder.GetDetailsOf(,k)
    Next
    j=0
    rows(j)=Join(cols,vbTab)
    For Each FolderItem In Folder.Items
    For k=0 To COL
    Cols(k)=Folder.GetDetailsOf(FolderItem,k)
    Next
    j=j+1
    rows(j)=Join(cols,vbTab)
    Next
    WScript.Echo Join(rows,vbCRLF)
    End Sub

    Sub DeleteZIP()
    Dim fso
    Dim Shell
    Dim ZIPfile
    Dim Folder
    Dim FolderItem

    If WScript.Arguments.Count<optind+2 Then
    WScript.Echo "Arguments Missing."
    WScript.Quit
    End If

    Set fso=CreateObject("Scripting.FileSystemObject")
    Set Shell=CreateObject("Shell.Application")
    ZIPfile=fso.GetAbsolutePathName(WScript.Arguments(optind))
    If UCase(fso.GetExtensionName(ZIPfile))<>"ZIP" Then
    WScript.Echo "Invalid Extension Name -",fso.GetExtensionName(ZIPfile)
    WScript.Quit
    End If
    Set Folder=Shell.NameSpace(ZIPfile)
    For optind=optind+1 To WScript.Arguments.Count-1
    Set FolderItem=Folder.ParseName(WScript.Arguments(optind))
    If FolderItem Is Nothing Then
    WScript.Echo WScript.Arguments(optind),"- Not Found."
    WScript.Quit
    End If
    ' FolderItem.InvokeVerb("delete")
    FolderItem.InvokeVerb("??(&D)")
    Next
    End Sub

    Sub ExtractZIP()
    Dim fso
    Dim Shell
    Dim ZIPfile
    Dim Folder
    Dim FolderItem
    Dim dFolder

    If WScript.Arguments.Count<optind+1 Then
    WScript.Echo "Arguments Missing."
    WScript.Quit
    End If

    Set fso=CreateObject("Scripting.FileSystemObject")
    Set Shell=CreateObject("Shell.Application")
    ZIPfile=fso.GetAbsolutePathName(WScript.Arguments(optind))
    If UCase(fso.GetExtensionName(ZIPfile))<>"ZIP" Then
    WScript.Echo "Invalid Extension Name -",fso.GetExtensionName(ZIPfile)
    WScript.Quit
    End If
    Set Folder=Shell.NameSpace(ZIPfile)
    Set dFolder=Shell.NameSpace(fso.GetAbsolutePathName(""))
    If WScript.Arguments.Count<optind+2 Then
    dFolder.CopyHere Folder.Items
    Else
    For optind=optind+1 To WScript.Arguments.Count-1
    Set FolderItem=Folder.ParseName(WScript.Arguments(optind))
    If FolderItem Is Nothing Then
      WScript.Echo WScript.Arguments(optind),"- Not Found."
      WScript.Quit
    End If
    dFolder.CopyHere FolderItem
    Next
    End If
    End Sub
     
    Последнее редактирование модератором: 5 мар 2016
  2. regist
    Оффлайн

    regist гоняюсь за туманом Ассоциация VN/VIP VIP Разработчик

    Сообщения:
    11.382
    Симпатии:
    5.268
    а чего долго искал? Тут в соседней теме: Класс для создания и распаковки архивов ZIP.
    А насчёт добавления пароля подожди @Dragokas
     
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Не знаю таких способов.
    Может, что-то из состава Net.FrameWork это умеет, тогда через PowerShell. Но я беглым поиском тоже ничего такого не нашел.
    Но у системы еще много потайных козырей.
    На счет скриптов я бы спросил на сером форуме.
    А на счет .net на любом большом форуме в разделах по C# так и указав, что не используя библиотек. Если кто сможет, то там перевести на PS не сложно.

    Приведенный Вами код - это использование такого же метода .CopyHere, как по ссылке от regist.
    Там используется системная библиотека zipfldr.dll, которая хоть и умеет распаковывать с паролем, но открытых интерфейсов не имеет (есть закрытые, но к ним без стороннего ПО не добраться).
    А CopyHere - это даже не связанный с архивацией метод. Просто так получилось, что M$ сократила затраты и сделала для ZIP архивов тот же интерфейс, что и для обычных папок,
    поэтому перетягивание на нее файлов расценивается как упаковка в архив.
     
  4. Сергей
    Оффлайн

    Сергей Активный пользователь

    Сообщения:
    253
    Симпатии:
    120
    А unrar.dll ?, она же в виндовсе по умолчанию есть (кажется) Прекрасно позволяет програмно работать с rar-архивами (и паролями тоже) без наличия установленного RAR.
     
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Посмотрел на Win XPx64, Win7x32 и Win10x32.
    Там такой библиотеки нет. Это ошмётки от WinRAR.
    Да и не так много есть библиотек, которые поддерживают вызов функций с помощью rundll32, если Вы подразумевали ее.
    Для этого требуется специальный прототип, либо чтобы функция имела не более 2-х значимых аргументов с целочисленным типом в 4 байта,
    но в этом случае если вызвать функцию из-под rundll32, будет разрушен стек, что ведет к заранее непредсказуемым последствиям.
     
  6. regist
    Оффлайн

    regist гоняюсь за туманом Ассоциация VN/VIP VIP Разработчик

    Сообщения:
    11.382
    Симпатии:
    5.268
    по умолчанию нет и не должна быть. Потому что это часть от WinRar, также как и unrar.exe и если работать с командной строки, то удобней с .exe
     

Поделиться этой страницей