Как заархивировать файлы с помощью PowerShell (без PS версии 5 или NET Framework 4.5) - PullRequest
0 голосов
/ 29 мая 2020

Я ищу способ создать новый ZIP-архив или добавить файлы в существующий архив с помощью Powershell. Этот сценарий будет запускаться на очень старых системах, некоторые из которых все еще используют Powershell версии 2 и. NET Framework 3.0 или более ранней версии. Нет никакой возможности обновления, потому что это клиентские производственные системы, которые не подключены к inte rnet, и у меня нет возможности устанавливать какие-либо надстройки или расширения.

Из-за сколько лет этим системам, я не могу использовать Compress-Archive или System.IO.Compression.FileSystem. У меня есть весь скрипт, кроме самой функции архивирования. Во всех других онлайн-решениях мне предлагалось либо использовать способ. NET 4.5, либо способ PowerShell V5, а это невозможно в системах, над которыми я работаю. Любые идеи?

Вот ссылка на мой код: https://pastebin.com/m8FjFhcr Строка # 113 - это то место, где команды zip будут go.

1 Ответ

3 голосов
/ 30 мая 2020

Вы можете использовать Shell.Application.

# Create an empty zip file
$byte = @([byte]80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
[System.IO.File]::WriteAllBytes(".\Desktop\zip.zip", $byte)

# New Shell.Application ComObject
$sa = New-Object -ComObject Shell.Application

# Path to folder containing items you wish to zip
$in = $sa.NameSpace("C:\Users\Ash\Desktop\test") # Specify full path

# Path to zip file created earlier
$out = $sa.NameSpace("C:\Users\Ash\Desktop\zip.zip") # Specify full path

# Copy files in to archive.
$out.CopyHere($in.Items(), 4) # 4 = No Progress Box

Folder.CopyHere

Всем нравится многоразовая функция и возможность использовать относительные пути ...

function ConvertTo-Archive {
    Param(
        [parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [Alias("FullName")]
        [ValidateScript({Test-Path $_})]
        [string]$Path,

        [parameter(Mandatory=$true)]
        [string]$Output
    )
    # Convert relative path if one has been used.
    $Source = [System.IO.Path]::GetFullPath($Path)
    $Destination = [System.IO.Path]::GetFullPath($Output)

    $byte = @([byte]80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
    [System.IO.File]::WriteAllBytes($Destination, $byte)
    $sa = New-Object -ComObject Shell.Application
    $in = $sa.NameSpace($Source)
    $out = $sa.NameSpace($Destination)
    $out.CopyHere($in.Items(), 4)
}

Использование

ConvertTo-Archive -Path .\Desktop\test\ -Output .\Desktop\zip.zip

Или

Get-Item .\Desktop\test\ | ConvertTo-Archive -Output .\Desktop\zip.zip
...