Невозможно сжать файл с помощью Powershell 2.0

Q1. Я попробовал несколько сжатых методов, но ни один из них не работает на моей машине. Я просто могу использовать внешний zip-инструмент 7z.exe для сжатия файла, но у меня нет прав ни для установки файла 7z.exe на serverA, ни для обновления powershell до v5. в настоящее время использую powershell v2 Пробовал, как показано ниже, но ничего из этого не работает. Итак, любой другой метод может ввести меня для сжатого файла?

  • Add-Type -assembly "system.io.compression.filesystem"
  • Сжать-Архив
  • Add-Type -Path C:\Reference\Draftdoc.docx
  • C:\Reference\Images\diagram2.vsd -Оптимальный уровень сжатия
    -DestinationPath C:\Archives\Draft.Zip

Q2. Ниже приведен запрос, который я использую для инструментов 7z.exe (этот serverB поставляется с 7z.exe), но я столкнулся с ошибкой. Я хочу сжать любой файл с сегодняшней датой.

$timestamp = (Get-Date).ToString('yyyy-MM')
$source = "D:\csv\*.csv", "D:\csv2\*.csv"
$target = "D:\CSV2_$timestamp.zip"
$7zip = "D:\Program Files\7-Zip\7z.exe"

#Compressed file
if (-not (test-path $7zip)) {throw '$7zip needed'} 
set-alias sz $7zip  

sz a -mx=9 $target $source
{
    Get-ChildItem $source | Where{$_.LastWriteTime -gt (Get-Date).AddDays(-1)}
}

Примечание. Для обоих серверов мне также нужен сжатый файл, но сервер A не поставляется с 7z, а сервер B поставляется с 7z.exe.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
464
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это должно работать:

Add-Type -Assembly "System.IO.Compression.FileSystem"
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcePath, $destinationZip)

См. Add-Type: Невозможно добавить тип. Не удалось найти сборку «System.IO.Compression.FileSystem». для альтернативных способов загрузки требуемой сборки.

Я не верю, что это поддерживалось в PowerShell 2 (который поставлялся с Windows 7 и соответствующей серверной версией — 2008R2, IIRC). В PowerShell 2 единственным вариантом для кверента может быть использование внешней программы сжатия, такой как 7Zip. Если у него недостаточно прав для установки на сервер, ему может потребоваться обратиться к своему системному администратору за дополнительной помощью.

Jeff Zeitlin 27.06.2019 13:42

@mhu Add-Type: невозможно добавить тип. Не удалось найти сборку system.io.compression.filesystem. Я упоминал в сообщении выше.

user3542587 27.06.2019 14:08

@JeffZeitlin спасибо за разъяснения. я думал, что это только что случилось со мной, который не может использовать другой синтаксис сжатия. Кстати, есть идеи, как бороться с Q2?

user3542587 27.06.2019 14:18

Не зная, с какой ошибкой вы столкнулись, невозможно даже приступить к решению этого вопроса.

Jeff Zeitlin 27.06.2019 14:23
Ответ принят как подходящий

Вам придется использовать гораздо более старый Shell.Application Метод COM-объекта.

function Extract-Zip
{
    param([string]$zipfilename, [string] $destination)

    if (test-path($zipfilename))
    {   
        $shellApplication = new-object -com shell.application
        $zipPackage = $shellApplication.NameSpace($zipfilename)
        $destinationFolder = $shellApplication.NameSpace($destination)
        $destinationFolder.CopyHere($zipPackage.Items())
    }
}

Обратите внимание, что я думаю, что это работает только в Windows Vista или Server 2008 или более поздней версии. Если вы используете Server 2003 — а этого делать не следует — вам, насколько мне известно, придется использовать стороннее программное обеспечение.

Само собой разумеется, но вам крайне необходимо обновить свои серверы. Я не говорю, что вам нужно установить самую последнюю версию PowerShell. Я говорю, что вы явно используете Server 2008 R2 или более раннюю версию, а это 2019 год.

Я использую Window Server 2008 и Powershell v2: «D, этот метод будет работать для Window Server 2016. В следующем году у меня будет обновление до WS2016, прежде чем обновление, я сначала автоматизирую сжатие файла.

user3542587 27.06.2019 15:17

@user3542587 user3542587 Да, это должно работать и с 2016 годом. При этом используется компонент zip, который использует проводник Windows, поэтому должна работать любая версия Windows, имеющая встроенную поддержку ZIP. Я не могу вспомнить, существовало ли это в XP/2k3, но я знаю, что это было в Vista/2k8. Однако в конечном итоге вы должны обновить свой код, чтобы использовать собственный Expand-Archive, потому что COM-объекты могут быть немного ненадежными в PowerShell. Они не используют объекты .Net, поэтому они не работают так же хорошо, как собственные классы .Net.

Bacon Bits 27.06.2019 19:02

Согласно вашему второму вопросу, где 7z установлен в ServerB, эта функция архивирует нужные вам файлы, этот код не зависит от вашей версии powershell.

function Compress-Items ($ItemsPaths, $dest) {
    $Path = "D:\Program Files\7-Zip\7z.exe"
    $argList = "a -tzip -y `"$dest`""
    foreach ($item in $ItemsPaths) {
        $argList += " `"$item`""
    }

    Start-Process -FilePath $Path -ArgumentList $argList
}

$source = (get-childitem -Path "D:\csv", "D:\csv2" -Include "*.csv" -Recurse).FullName
Compress-Items -ItemsPaths $source -dest $destination

Примечание

Я изменил ваш $source, потому что это правильный способ получить все файлы csv, которые вы хотите.

Другие вопросы по теме