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





Это должно работать:
Add-Type -Assembly "System.IO.Compression.FileSystem"
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcePath, $destinationZip)
См. Add-Type: Невозможно добавить тип. Не удалось найти сборку «System.IO.Compression.FileSystem». для альтернативных способов загрузки требуемой сборки.
@mhu Add-Type: невозможно добавить тип. Не удалось найти сборку system.io.compression.filesystem. Я упоминал в сообщении выше.
@JeffZeitlin спасибо за разъяснения. я думал, что это только что случилось со мной, который не может использовать другой синтаксис сжатия. Кстати, есть идеи, как бороться с Q2?
Не зная, с какой ошибкой вы столкнулись, невозможно даже приступить к решению этого вопроса.
Вам придется использовать гораздо более старый 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 user3542587 Да, это должно работать и с 2016 годом. При этом используется компонент zip, который использует проводник Windows, поэтому должна работать любая версия Windows, имеющая встроенную поддержку ZIP. Я не могу вспомнить, существовало ли это в XP/2k3, но я знаю, что это было в Vista/2k8. Однако в конечном итоге вы должны обновить свой код, чтобы использовать собственный Expand-Archive, потому что COM-объекты могут быть немного ненадежными в PowerShell. Они не используют объекты .Net, поэтому они не работают так же хорошо, как собственные классы .Net.
Согласно вашему второму вопросу, где 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, которые вы хотите.
Я не верю, что это поддерживалось в PowerShell 2 (который поставлялся с Windows 7 и соответствующей серверной версией — 2008R2, IIRC). В PowerShell 2 единственным вариантом для кверента может быть использование внешней программы сжатия, такой как 7Zip. Если у него недостаточно прав для установки на сервер, ему может потребоваться обратиться к своему системному администратору за дополнительной помощью.