2016-06-29 2 views
1

У меня возникла проблема с использованием сжатия zip в сценарии Powershell. Фрагмент кода, о котором идет речь:Ошибка Powershell при использовании загруженной сборки

$zipfile = $targetFile 
$file = 'Script.ps1' 

$stream = New-Object IO.FileStream($zipfile, [IO.FileMode]::Open) 
$mode = [System.IO.Compression.ZipArchiveMode]::Update 
$zip = New-Object IO.Compression.ZipArchive($stream, $mode) 

($zip.Entries | ? { $file -contains $_.Name }) | % { $_.Delete() } 

# Add a newer Script.ps1 file with the new Comment Based Help template. 
$newFile = "$PSScriptRoot\$file" 
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip,$newFile,"Script.ps1","optimal") 

# Clean up. 
$zip.Dispose() 
$stream.Close() 
$stream.Dispose() 

код пытается удалить файл из архива, а затем добавить новую версию того же файла. Когда я запускаю сценарий, я получаю следующее:

[ERROR] Невозможно найти тип [System.IO.Compression.ZipArchiveMode]. Убедитесь, что сборка [ERROR], которая содержит этот тип, загружена . [ОШИБКА] В C: \ xxxxx \ xxxxx \ xxxxx \ PowerShellIDEInstallers \ PowerShel [ERROR] lIDEInstallers \ VSInstallCBH.ps1: 141 char: 2 [ERROR] + $ mode = [System.IO.Compression.ZipArchiveMode] :: Обновить [ОШИБКА] +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ [ERROR] + Категория: InvalidOperation: (System.IO.Compression.ZipArch [ERROR] iveMode: TypeName) [], RuntimeException [ERROR] + FullyQualifiedErrorId: TypeNotFound [ERROR]

Однако, если я запустил его снова, он будет работать правильно. Я нашел несколько сообщений (this и this), которые говорили о похожих проблемах. Я в настоящее время использую:

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

В верхней части сценария. Я также нашел this post, который выглядел многообещающим, но не работал. Я также должен добавить, что проблема возникает в ISE, Visual Studio и командной строке. Код будет работать, если я запустил его второй раз в любой среде.

Я сбитый с толку и в растерянности. Может ли кто-нибудь сказать мне, почему это происходит?

ответ

1

Ответ Дэйва был частичным ключом к разрешению. Изменение команды Add-Type, как он предложил, сделал все лучше. Тем не менее, код по-прежнему не удалось, так как изменение, которое он предложил, теперь вызвало команду:

[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip,$newFile,"Script.ps1","optimal") 

Ошибка.

я был в состоянии исправить это и исправить эту проблему, как только я нашел:

Чтобы использовать методы расширения, вы должны ссылаться на сборку System.IO.Compression.FileSystem в вашем проекте.

С предложением Дэйва, я просто добавил следующее, чтобы исправить мою проблему:

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

код теперь работает правильно в первый раз.

2

Вы близко. В этом случае вам нужно загрузить еще одну сборку. Использование:

Add-Type -AssemblyName System.IO.Compression 
Смежные вопросы