2017-03-22 14 views
0

現在、特定のファイルを圧縮し、APIを介してWebサーバーにアップロードしてからローカルに再度削除するスクリプトを作成しています。作成後にZIPファイルを削除するには?ファイルの使用が継続されています

これが私たちの現在のコードです:

$sourceFile = "D:\myfile.txt" 
$destinationFile = "D:\myfile.zip" 

function Add-Zip 
{ 
    Param([string]$zipfilename) 

    if (-not (Test-Path($zipfilename))) 
    { 
      Set-Content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
      (dir $zipfilename).IsReadOnly = $false  
    } 

    $shellApplication = New-Object -Com Shell.Application 
    $zipPackage = $shellApplication.NameSpace($zipfilename) 

    foreach ($file in $input) 
    { 
      $zipPackage.CopyHere($file.FullName) 
      Start-Sleep -Milliseconds 500 
    } 
} 

dir $sourceFile | Add-Zip $destinationFile 
Write-Host "zip created" 

# code to upload the zip here 

Remove-Item $destinationFile 
Write-Host "zip removed" 

それは完全にzipファイルを作成し、アップロードはあまりにも動作しますが、試してはRemove-Itemを使用してzipファイルを削除するとき、我々は

は、Remove-項目を取得します:アイテムD:\ myfile.zipを削除できません:プロセスは別のプロセスで使用されているため、ファイル 'D:\ myfile.zip'にアクセスできません。

どうすればこのロックを解除できますか?後でファイルを削除できるように.Dispose()できることはありますか?

+2

ShellApplicationオブジェクトは、おそらくあなたがちょうど '削除-変数を-Forceを追加する必要があるかもしれません、ファイル上に保持しています-name shellApplication'を 'Add-Zip'関数の最後に追加して、これをクリーンアップします。 –

+0

'foreach($ file in $ input)' - $ inputとは何ですか? –

+1

私はこれを複製できません。 'Shell.Application'はファイルにロックを保持していません。プロセスエクスプローラを使用して、それが何か他のものでないことを確認してみてください。(AVかもしれませんか?) –

答えて

0

オーケーは、ここでは別の方法を見つけました:https://danvers72.wordpress.com/2014/11/18/creating-a-zip-file-from-a-single-file/

は、これは私の作業コードです:

$sourceFile = "D:\myfile.txt" 
$destinationFile = "D:\myfile.zip" 

<# 
.Synopsis 
    Creates a new archive from a file 
.DESCRIPTION 
    Creates a new archive with the contents from a file. This function relies on the 
    .NET Framework 4.5. On windwows Server 2012 R2 Core you can install it with 
    Install-WindowsFeature Net-Framework-45-Core 
.EXAMPLE 
    New-ArchiveFromFile -Source c:\test\test.txt -Destination c:\test.zip 
#> 
function New-ArchiveFromFile 
{ 
    [CmdletBinding()] 
    [OutputType([int])] 
    Param 
    (
     # Param1 help description 
     [Parameter(Mandatory=$true, 
        ValueFromPipelineByPropertyName=$false, 
        Position=0)] 
     [string] 
     $Source, 
     # Param2 help description 
     [Parameter(Mandatory=$true, 
        ValueFromPipelineByPropertyName=$false, 
        Position=1)] 
     [string] 
     $Destination 
    ) 
    Begin 
    { 
     [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null 
    } 
    Process 
    { 
     try 
     { 
      Write-Verbose "Creating archive $Destination…." 
      $zipEntry = "$Source" | Split-Path -Leaf 
      $zipFile = [System.IO.Compression.ZipFile]::Open($Destination, 'Update') 
      $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal 
      [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zipfile,$Source,$zipEntry,$compressionLevel) 
      Write-Verbose "Created archive $destination." 
     } 
     catch [System.IO.DirectoryNotFoundException] 
     { 
      Write-Host "ERROR: The source $source does not exist!" -ForegroundColor Red 
     } 
     catch [System.IO.IOException] 
     { 
      Write-Host "ERROR: The file $Source is in use or $destination already exists!" -ForegroundColor Red 
     } 
     catch [System.UnauthorizedAccessException] 
     { 
      Write-Host "ERROR: You are not authorized to access the source or destination" -ForegroundColor Red 
     } 
    } 
    End 
    { 
     $zipFile.Dispose() 
    } 
} 

New-ArchiveFromFile -Source $sourceFile -Destination $destinationFile 

# code to upload the zip here 

Remove-Item $destinationFile 
関連する問題