Я новичок в Powershell. У меня есть потребность, для которой я считал, что она идеально подходит. Тем не менее, я быстро дошел до того, что чувствую, что нахожусь над своей головой. По сути, мне нужно создать файл .zip.
У меня есть каталог, который выглядит следующим образом:
MyStuff
Dir1
Child1
File1.txt
Child2
File1.png
Child3
File1.txt
Dir2
File1.txt
File1.txt
File2.txt
File3.txt
...
Мне нужно создать файл .zip с именем bundle.zip. Bundle.zip НЕ должен содержать все файлы внутри MyStuff. Вместо этого мне нужно включить MyStuff / File1.txt, MyStuff / File2.txt, MyStuff / File3.txt и MyStuff / Dir1 / * в файл .zip. Я понятия не имею, как это сделать с помощью PowerShell.
На моем компьютере установлен PowerShell v1.0. Я пробовал «Write-Zip» из расширений сообщества PowerShell, однако я получаю сообщение об ошибке: «Термин« Write-Zip »не распознается как имя командлета, функции, файла сценария или рабочего программа ».
Что я делаю не так?
Архивирование можно выполнить с помощью CreateFromDirectory
метод класса .NET System.IO.Compression.ZipFile
. Я предпочитаю использовать .NET, а не устанавливать расширения сообщества и другие надстройки, чтобы сохранить среду сервера как можно более чистой.
Я считаю, что вы не можете использовать его для добавления в zip-архив, но вам нужно будет временно скопировать файлы и папки с правильной структурой в промежуточный каталог. Оттуда вы можете создать zip-файл и удалить промежуточное содержимое.
Чтобы использовать .NET для архивирования, вам сначала нужно загрузить сборку класса:
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")
Затем вы можете вызвать класс:
[System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)
Куда:
$DirPath
это каталог, который вы хотите заархивировать.
$ZipFilePath
это имя zip-файла, который вы хотите создать.
$Compressionlevel
можно установить на Optimal
, Fastest
или NoCompression
.
$includeBaseDir
возможно $true
или $false
.
Я написал из него функцию, чтобы избавить меня от необходимости искать Справочная страница .NET все время. Если вы посмотрите на страницу, вы увидите, что есть способ разархивирования.
Требуется .NET 4.5, и я настоятельно рекомендую вам также обновить PowerShell. Каждая версия принесла огромные улучшения. Кроме того, оказалось, что использование .NET является эффективным, поскольку сравнив его с популярными сторонними zip-приложениями, он показал хорошие результаты.
Функция довольно понятна, просто убедитесь, что вы запустили саму функцию перед ее вызовом. Вот краткое изложение синтаксиса, если оно вам нужно:
New-ZipFile {DirToZip} {ZipfilePathAndName} {fastORoptimalORnocompression} {IncludeBaseDirectoryInZip($true or $false)}
Так что застегнуть E:\stuff
к D:\zipfile.zip
используя оптимальное сжатие и включить .\stuff
в zip-файле вы должны запустить:
New-ZipFile 'E:\stuff' 'D:\zipfile.zip' Optimal $true
Вот функция:
#region function New-ZipFile
<#
.Synopsis
Creates a zip file from a directory.
.DESCRIPTION
Creates a zip file from a directory. Options include compression level and wether or not to include the base directory. Class reference: https://msdn.microsoft.com/en-us/library/hh875104(v=vs.110).aspx
.EXAMPLE
New-ZipFile c:\dir c:\zipfile.zip Fastest $True
.EXAMPLE
New-ZipFile c:\dir c:\zipfile.zip Optimal $True
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
function New-ZipFile
{
Param
(
# The directory to zip.
[Parameter(Mandatory=$true,
Position=0)]
[ValidateNotNullOrEmpty()]
[string]$DirPath,
# The zipfile name.
[Parameter(Mandatory=$true,
Position=1)]
[ValidateNotNullOrEmpty()]
[string]$ZipFilePath,
# Specifies values that indicate whether a compression operation emphasizes speed or compression size.
[Parameter(Mandatory=$true,
Position=2)]
[ValidateNotNullOrEmpty()]
[ValidateSet("Fastest", "NoCompression", "Optimal", ignorecase=$True)]
[string]$CompressionLevel,
# $True to include the directory name from sourceDirectoryName at the root of the archive; $False to include only the contents of the directory.
[Parameter(Mandatory=$true,
Position=3)]
[ValidateNotNullOrEmpty()]
[bool]$includeBaseDir
)
#Load the .NET 4.5 zip-assembly
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
# Zip the directory.
[System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)
}
#endregion
РЕДАКТИРОВАТЬ: парень по сценариям написал статью, в которой показывает альтернативный способ загрузки сборки, это немного чище.
Вам необходимо загрузить расширение сообщества Powershell, совместимое с вашей установленной версией Powershell, и установить его. После завершения установки вам нужно переместить модуль PSCX из папки Program files в модуль Powershell, а затем попробовать использовать команду Write-Zip.