2016-12-12 6 views
0

特定の日付に作成されたすべてのファイルを圧縮するためのスクリプトが用意されています。powershellを使用して特定の日付に作成されたファイルを解凍する方法は?

Add-Type -AssemblyName System.IO.Compression.FileSystem 

$logfolder = "c:\users\riteshthakur\desktop\abc" 
$startdate = "20161205" 
$enddate = "20161205" 

[System.IO.Compression.ZipArchive] $arch = [System.IO.Compression.ZipFile]::Open('c:\users\riteshthakur\desktop\arch.zip', [System.IO.Compression.ZipArchiveMode]::Update) 

Get-ChildItem - path $logFolder | 
Where-Object {$_.CreationDate -gt $startDate -and $_.CreationDate -lt $endDate} | 
foreach{[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($arch,$_.FullName,$_.Name)} 
# archive will be updated with files after you close it. normally, in C#, you would use "using ZipArchvie arch = new ZipFile" and object would be disposed upon exiting "using" block. here you have to dispose manually: 
$arch.Dispose() 

私はこのスクリプトを実行していますが、これは投げている:「タイプを追加することはできませんアセンブリ 『System.IO.Compression.FileSystem』が見つかりませんでした。」

助けてください。ここ

+0

Powershellに 'Compress-Archive'と' Expand-Archive'があります(どのバージョンが登場しているのかわかりません)。 – 4c74356b41

+0

これはPowerShellバージョン5.0に含まれています。私はまだpowershell 4.0を使用しています –

+0

これは.NETフレームワークの問題です(他の回答を参照)。もし私が間違っていたら私に知らせてください。私たちはdup投票を取り消すことができます。 – Matt

答えて

0

Originally published by Bryan C. O'Connellは、郵便番号の関数である。次のように

# Purpose: Creates a .zip file of a file or folder. 
# Params: 
# -target: The file or folder you would like to zip. 
# 
# -zip_to: The location where the zip file will be created. If an old version 
# exists, it will be deleted. 
# 
# -compression (optional): Sets the compression level for your zip file. Options: 
# a. fast - Higher process speed, larger file size (default option). 
# b. small - Slower process speed, smaller file size. 
# c. none - Fastest process speed, largest file size. 
# 
# -add_timestamp (optional): Applies a timestamp to the .zip file name. 
# By default, no timestamp is used. 
# 
# -confirm (optional): When provided, indicates that you would like to be 
# prompted when the zip process is finished. 
# 
# |Info| 

[CmdletBinding()] 
Param (
    [Parameter(Mandatory=$true,Position=0)] 
    [string]$target, 

    [Parameter(Mandatory=$true,Position=1)] 
    [string]$zip_to, 

    [Parameter(Mandatory=$false,Position=2)] 
    [ValidateSet("fast","small","none")] 
    [string]$compression, 

    [Parameter(Mandatory=$false,Position=3)] 
    [bool]$timestamp, 

    [Parameter(Mandatory=$false,Position=4)] 
    [bool]$confirm 
) 

#-----------------------------------------------------------------------------# 
function DeleteFileOrFolder 
{ Param([string]$PathToItem) 

    if (Test-Path $PathToItem) 
    { 
    Remove-Item ($PathToItem) -Force -Recurse; 
    } 
} 

function DetermineCompressionLevel{ 
[Reflection.Assembly]::LoadFile('C:\WINDOWS\System32\zipfldr.dll') 
Add-Type -Assembly System.IO.Compression.FileSystem 
    $CompressionToUse = $null; 

    switch($compression) 
    { 
    "fast" {$CompressionToUse = [System.IO.Compression.CompressionLevel]::Fastest} 
    "small" {$CompressionToUse = [System.IO.Compression.CompressionLevel]::Optimal} 
    "none" {$CompressionToUse = [System.IO.Compression.CompressionLevel]::NoCompression} 
    default {$CompressionToUse = [System.IO.Compression.CompressionLevel]::Fastest} 
    } 

    return $CompressionToUse; 
} 

#-----------------------------------------------------------------------------# 
Write-Output "Starting zip process..."; 

if ((Get-Item $target).PSIsContainer) 
{ 
    $zip_to = ($zip_to + "\" + (Split-Path $target -Leaf) + ".zip"); 
} 
else{ 

    #So, the CreateFromDirectory function below will only operate on a $target 
    #that's a Folder, which means some additional steps are needed to create a 
    #new folder and move the target file into it before attempting the zip process. 
    $FileName = [System.IO.Path]::GetFileNameWithoutExtension($target); 
    $NewFolderName = ($zip_to + "\" + $FileName) 

    DeleteFileOrFolder($NewFolderName); 

    md -Path $NewFolderName; 
    Copy-Item ($target) $NewFolderName; 

    $target = $NewFolderName; 
    $zip_to = $NewFolderName + ".zip"; 
} 

DeleteFileOrFolder($zip_to); 

if ($timestamp) 
{ 
    $TimeInfo = New-Object System.Globalization.DateTimeFormatInfo; 
    $CurrentTimestamp = Get-Date -Format $TimeInfo.SortableDateTimePattern; 
    $CurrentTimestamp = $CurrentTimestamp.Replace(":", "-"); 
    $zip_to = $zip_to.Replace(".zip", ("-" + $CurrentTimestamp + ".zip")); 
} 

$Compression_Level = (DetermineCompressionLevel); 
$IncludeBaseFolder = $false; 

[Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem"); 
[System.IO.Compression.ZipFile]::CreateFromDirectory($target, $zip_to, $Compression_Level, $IncludeBaseFolder); 

Write-Output "Zip process complete."; 

if ($confirm) 
{ 
    write-Output "Press any key to quit ..."; 
    $quit = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown"); 
} 

はこれを使用します。

zip.ps1 -target "C:\Projects\test" -zip_to "C:\projects\test2" [-compression fast] [-timestamp] [-confirm] 
+0

オリジナルのポスターがエラーを生成していたのと同じアセンブリを追加しようとしました。同じエラーはなぜ発生しませんか? –

+0

@JeffZeitlin:私は、このパス 'C:\ WINDOWS \ System32 \ zipfldr.dll'の下に* zipfldr.dll *がないというエラーを受け取っているシステムを信じています。そのファイルがあるかどうか確認してください。デフォルトでは、winrarまたは7zipを使用している場合は特にそうです。 –

+0

OK、何とか初めて[Reflection.Assembly] :: LoadFile( 'C:\ WINDOWS \ System32 \ zipfldr.dll') 'これは、全体としての機能を実行させる可能性があります。私は、そのアセンブリでも、すぐ後に続くAdd-Typeは元のポスターが尋ねていたのと同じエラーを投げないと確信していません。 –

関連する問題