Я пытаюсь заархивировать все файлы из одного каталога в другую папку в рамках простой процедуры резервного копирования.
Код работает нормально, но не создает zip-файл:
$srcdir = "H:\Backup"
$filename = "test.zip"
$destpath = "K:\"
$zip_file = (new-object -com shell.application).namespace($destpath + "\"+ $filename)
$destination = (new-object -com shell.application).namespace($destpath)
$files = Get-ChildItem -Path $srcdir
foreach ($file in $files)
{
$file.FullName;
if ($file.Attributes -cne "Directory")
{
$destination.CopyHere($file, 0x14);
}
}
Есть идеи, где я ошибаюсь?
Я обнаружил 2 дополнительных способа сделать это и включаю их для справки:
Использование .Net framework 4.5 (как предлагает @MDMarra):
[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
[System.AppDomain]::CurrentDomain.GetAssemblies()
$src_folder = "h:\backup"
$destfile = "k:\test.zip"
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$includebasedir = $false
[System.IO.Compression.ZipFile]::CreateFromDirectory($src_folder, $destfile, $compressionLevel, $includebasedir)
Это отлично сработало на моей машине разработки Win7 и, вероятно, это лучший способ сделать это, но .Net 4.5 поддерживается только на Windows Server 2008 (или более поздней версии), моя машина развертывания - Windows Server 2003.
Используя программу zip из командной строки:
function create-zip([String] $aDirectory, [String] $aZipfile)
{
[string]$PathToZipExe = "K:\zip.exe";
& $PathToZipExe "-r" $aZipfile $aDirectory;
}
create-zip "h:\Backup\*.*" "K:\test.zip"
Я загрузил info-zip и вызвал его с исходным и конечным местоположениями в качестве параметров.
Это работало нормально и было очень легко настроить, но требовало внешней зависимости.
Это работает в V2, должно работать и в V3:
$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
}
}