Есть ли способ сжать папку (например, в формате ZIP) в класс c ASP? - PullRequest
1 голос
/ 11 июля 2020

Я должен преобразовать папку в файл zip (или любой другой сжатый формат) в classi c ASP. Есть ли способ сделать это в classi c ASP или VBScript изначально без использования какой-либо внешней программы или библиотеки (т.е. сделать это полностью внутри файла. asp)?

Например, сжать C:\RandomFolder\ в C:\NewZipFile.zip.

В коде это должно быть примерно так:

function CompressFolder (folderLocation, zipLocation)
' code that compresses a folder using native VBScript functions and objects.
end function
CompressFolder("C:\RandomFolder\", "C:NewZipFile.zip")

(я использую IIS 10.0 с полными разрешениями для IUSR и неуправляемого classi c ASP код в качестве моего веб-сервера. У меня нет и не могу загрузить дополнительные утилиты архивирования .)

PS Это может звучать как дубликат из Как конвертировать папку в zip. файл в формате asp classi c. Однако единственный ответ не объясняет заархивирование с помощью classi c ASP (вместо этого используется ASP. NET), а ссылка, предоставленная Andrew , истекла. Кроме того, код user1649028 привел к ошибке. Сообщение было создано 8 лет назад go, и похоже, что с ним больше не будет никаких действий.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Compress-Archive доступно только с Powershell v4 , и большинству из них потребуется обновить свою версию PS, потому что они получат ошибку.

Итак, этот vbscript создан и протестирован в windows 10.

 1. Windows 10 and Windows Server 2016 - PowerShell version 5.0 ( it
    should get updated to 5.1 by Windows Update)
 2. Windows 8.1 and Windows Server 2012 R2 - PowerShell version 4.0
 3. Windows 8 and Windows Server 2012 - PowerShell version 3.0
 4. Windows 7 SP1 and Windows Server 2008 R2 SP1 - PowerShell version
    2.0

Compress_Archive_by_Extension.vbs

Option Explicit
Dim Title,ArrExt,Ext
Title = "Compress Archive With Powreshell And Vbscript by Hackoo 2020"
REM We define an array of extensions for archiving !
ArrExt = Array("vbs","vbe","cmd","bat","ps1","js","jse","lnk")

REM Looping thru extensions defined from our array in order to zip and archive them, 
REM so you can add or remove what you want as extension in the array above !
For each Ext in ArrExt
    Call Compress_Archive("%Temp%\*."& Ext,"Temp_Archive_"& Ext)
    Call Compress_Archive("%AppData%\*."& Ext,"AppData_Archive_"& Ext)
    Call Compress_Archive("%LocalAppData%\*."& Ext,"LocalAppData_Archive_"& Ext)
    Call Compress_Archive("%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup\*."& Ext,"ProgramData_Archive_"& Ext)
    Call Compress_Archive("%UserProfile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\*."& Ext,"UserProfile_Archive_"& Ext)
Next

MsgBox "Archive Script is completed !",vbInformation,Title
'---------------------------------------------------------------------
REM https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-5.1&redirectedfrom=MSDN
Sub Compress_Archive(Source,Destination)
    Const ForWriting = 2
    Dim fs,Ws,ts,Ret,PSFile,ByPassPSFile
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set Ws = WScript.CreateObject("WScript.Shell")
    Source = Ws.ExpandEnvironmentStrings(Source)
    Destination = Ws.ExpandEnvironmentStrings(Destination)
    PSFile = Ws.ExpandEnvironmentStrings("%Temp%") & fs.GetTempName & ".ps1"
    ByPassPSFile = "PowerShell -ExecutionPolicy bypass -noprofile -file "
    Set ts = fs.OpenTextFile(PSFile,ForWriting,True)
    ts.WriteLine "Compress-Archive -Path " & DblQuote(Source) &_
 " -Update -CompressionLevel Optimal -DestinationPath "& DblQuote(Destination)
    ts.Close
    Ret = Ws.run(ByPassPSFile & PSFile,0,True)
    If fs.FileExists(PSFile) Then fs.DeleteFile(PSFile)
End Sub
'---------------------------------------------------------------------
Function DblQuote(Str)
    DblQuote = Chr(34) & Str & Chr(34)
End Function
'---------------------------------------------------------------------
0 голосов
/ 14 июля 2020

РЕДАКТИРОВАТЬ: Извините, я упустил из виду «невозможно загрузить дополнительные утилиты для архивирования», возможно, проведите небольшое исследование, чтобы узнать, можете ли вы аналогичным образом использовать встроенную функцию сжатия windows.

Как уже упоминалось, это невозможно сделать только с VBScript, вам понадобится внешняя программа. Если на вашем сервере установлен WinRAR, вы можете использовать WScript.Shell для архивирования папок с помощью командной строки:

Sub ZipFolder(Folder,SaveTo,ZipName)

    Dim CMD, objShell
    
    CMD = """%ProgramFiles%\WinRAR\WinRAR.exe"" a -afzip -ep1 -ibck " &_
    """" & Server.MapPath(SaveTo) & "\" & ZipName & """ " &_
    """" & Server.MapPath(Folder) & """"
                                
    Set objShell = server.CreateObject("WScript.Shell")
    
        Call objShell.Exec(CMD)
                
    Set objShell = Nothing
            
End Sub
    
Call ZipFolder("documents","zip-archives","test.zip")

В этом примере папка «документы» будет заархивирована и сохранена в «zip- архивирует папку как "test.zip". ZIP-архив будет содержать папку «документы» и все ее содержимое.

-ep1 предотвращает вложенность полного базового пути. Поэтому, когда вы откроете zip-файл, вы увидите только заархивированную папку, а не вложенную структуру папок, например: inetpub/website/www/documents/[documents content].

-ibck предписывает WinRAR работать в фоновом режиме.

Если вы хотите заархивировать только содержимое папки, а не саму папку, вы можете изменить:

"""" & Server.MapPath(Folder) & """"

Кому:

"""" & Server.MapPath(Folder) & "\*.*"""

...