単純なバックアップルーチンの一部として、1つのディレクトリ内のすべてのファイルを別のフォルダに圧縮しようとしています。
コードは問題なく実行されますが、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);
}
}
私が間違っているアイデアはありますか?
これは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
}
}
私はこれを行う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 をダウンロードし、ソースと宛先の場所をパラメーターとして呼び出しました。
これは問題なく動作し、設定も非常に簡単でしたが、外部依存関係が必要でした。