• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

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

mike 1

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

Код:
' 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
 
Последнее редактирование модератором:

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
11,836
Симпатии
5,571
#2

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#3
Не знаю таких способов.
Может, что-то из состава Net.FrameWork это умеет, тогда через PowerShell. Но я беглым поиском тоже ничего такого не нашел.
Но у системы еще много потайных козырей.
На счет скриптов я бы спросил на сером форуме.
А на счет .net на любом большом форуме в разделах по C# так и указав, что не используя библиотек. Если кто сможет, то там перевести на PS не сложно.

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

Сергей

Активный пользователь
Сообщения
302
Симпатии
149
#4
А unrar.dll ?, она же в виндовсе по умолчанию есть (кажется) Прекрасно позволяет програмно работать с rar-архивами (и паролями тоже) без наличия установленного RAR.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#5
Посмотрел на Win XPx64, Win7x32 и Win10x32.
Там такой библиотеки нет. Это ошмётки от WinRAR.
Да и не так много есть библиотек, которые поддерживают вызов функций с помощью rundll32, если Вы подразумевали ее.
Для этого требуется специальный прототип, либо чтобы функция имела не более 2-х значимых аргументов с целочисленным типом в 4 байта,
но в этом случае если вызвать функцию из-под rundll32, будет разрушен стек, что ведет к заранее непредсказуемым последствиям.
 

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
11,836
Симпатии
5,571
#6
А unrar.dll ?, она же в виндовсе по умолчанию есть (кажется)
по умолчанию нет и не должна быть. Потому что это часть от WinRar, также как и unrar.exe и если работать с командной строки, то удобней с .exe