Powershell - Zip только файлы, а не каталог

I ' m с помощью скрипта с сайта по ссылке . Но он архивирует каталог. Я бы предпочел, чтобы он архивировал только файлы внутри этого каталога, а имя zip-файла должно быть directory.zip.

Вот функция ZipFolder . Может ли кто-нибудь сказать мне, что нужно изменить, чтобы заархивировать только файлы внутри каталога?

function ZipFolder(
    [IO.DirectoryInfo] $directory)
{
    If ($directory -eq $null)
    {
        Throw "Value cannot be null: directory"
    }

    Write-Host ("Creating zip file for folder (" + $directory.FullName + ")...")

    [IO.DirectoryInfo] $parentDir = $directory.Parent

    [string] $zipFileName

    If ($parentDir.FullName.EndsWith("\") -eq $true)
    {
        # e.g. $parentDir = "C:\"
        $zipFileName = $parentDir.FullName + $directory.Name + ".zip"
    }
    Else
    {
        $zipFileName = $parentDir.FullName + "\" + $directory.Name + ".zip"
    }

    If (Test-Path $zipFileName)
    {
        Throw "Zip file already exists ($zipFileName)."
    }

    Set-Content $zipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))

    $shellApp = New-Object -ComObject Shell.Application
    $zipFile = $shellApp.NameSpace($zipFileName)

    If ($zipFile -eq $null)
    {
        Throw "Failed to get zip file object."
    }

    [int] $expectedCount = (Get-ChildItem $directory -Force -Recurse).Count
    $expectedCount += 1 # account for the top-level folder

    $zipFile.CopyHere($directory.FullName)

    # wait for CopyHere operation to complete
    WaitForZipOperationToFinish $zipFile $expectedCount

    Write-Host -Fore Green ("Successfully created zip file for folder (" `
        + $directory.FullName + ").")
}

#Remove-Item "C:\NotBackedUp\Fabrikam.zip"

[IO.DirectoryInfo] $directory = Get-Item "D:\tmp"
ZipFolder $directory
-2
задан 15 November 2018 в 13:11
2 ответа

Обнаружен альтернативный метод из serverfault

$srcdir = "H:\Backup"
$zipFilename = "test.zip"
$zipFilepath = "K:\"
$zipFile = "$zipFilepath$zipFilename"

#Prepare zip file
if(-not (test-path($zipFile))) {
    set-content $zipFile ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
    (dir $zipFile).IsReadOnly = $false  
}

$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipFile)
$files = Get-ChildItem -Path $srcdir | where{! $_.PSIsContainer}

foreach($file in $files) { 
    $zipPackage.CopyHere($file.FullName)
#using this method, sometimes files can be 'skipped'
#this 'while' loop checks each file is added before moving to the next
    while($zipPackage.Items().Item($file.name) -eq $null){
        Start-sleep -seconds 1
    }
}
0
ответ дан 5 December 2019 в 21:15

Прежде всего, добро пожаловать.

Если вы прочитаете код, вы увидите, что папка скопирована здесь, в zip-файл:

$zipFile.CopyHere($directory.FullName)

Что вам нужно сделать вместо этого нужно скопировать отдельные файлы в каталог.

В основном вам нужно cd в каталог и скопировать каждый childItem.

cd $Directory.FullName
foreach ($f in (get-childItem .))
{
  $zipFile.CopyHere($f)
}

Обратите внимание, что вам также придется удалить:

$expectedCount += 1 # account for the top-level folder

Попробуйте это, обратите внимание, что у меня есть обратите внимание, тестировал / отлаживал его вообще, это просто псевдокод, как бы я это сделал. Powershell хорош и мощен, но требует обучения.

2
ответ дан 5 December 2019 в 21:15

Теги

Похожие вопросы