Это можно сделать с помощью командлета Expand-Archive
, который доступен в PowerShell 5 и выше.(Версию PowerShell можно проверить с помощью переменной $PSVersionTable
.)
Для извлечения zip-файла в определенную папку используется следующий синтаксис:
Expand-Archive -Path 'ZipFile.zip' -DestinationPath 'ZipFolder'
или
Expand-Archive -LiteralPath 'ZipFile.zip' -DestinationPath 'ZipFolder'
Если используется параметр -Path
, PowerShell распознает такие символы, как *
, ?
, [
, ]
, как символы подстановки, что может вызвать непредвиденное поведение для путей к файлам, содержащих квадрат-brackets.
Если используется параметр -LiteralPath
, PowerShell не будет обрабатывать любые символы как символы подстановки.
При условии, что все ваши zip-файлы и папки следуют одному и тому же шаблону именования, который вы могли использоватьмассив выглядит так:
$Countries = @(
'France',
'USA',
'German'
'Italy',
'Danemark'
)
foreach ($Country in $Countries)
{
$ZipFilePath = $Country + 'Data.zip'
$DestinationPath = $Country + 'Folder'
Expand-Archive -LiteralPath $ZipFilePath -DestinationPath $DestinationPath
}
Если ваши файлы и папки не соответствуют одному и тому же шаблону именования, вы можете использовать словарь (или набор из KeyValuePair
с), например:
$ZipFilesAndFolders = @{
'FranceData.zip' = 'FranceFolder'
'USAData.zip' = 'USAFolder'
'GermanData.zip' = 'GermanFolder'
'ItalyData.zip' = 'ItalyFolder'
'DanemarkData.zip' = 'DanemarkFolder'
}
foreach ($KeyAndValue in $ZipFilesAndFolders.GetEnumerator())
{
$ZipFilePath = $KeyAndValue.Key
$DestinationPath = $KeyAndValue.Value
Expand-Archive -LiteralPath $ZipFilePath -DestinationPath $DestinationPath
}
С PowerShell 4 (и 3)
Если у вас установлен .Net Framework 4.5, вы можете использовать Microsoft.PowerShell.Archive
, созданный PowerShellteam.
PowerShell 4 требует .Net Framework 4.5, так что это должно работать без каких-либо системных изменений.
Модуль можно найти по адресу https://github.com/PowerShell/Microsoft.PowerShell.Archive
Используемый синтаксис идентичен, функция Expand-Archive
и параметры -Path
, -LiteralPath
и -DestinationPath
.
Просто убедитесь, что вы импортировали модуль перед его использованием, это можно сделать с помощью командлета Import-Module
следующим образом:
Import-Module -Name 'Microsoft.PowerShell.Archive' -Force
PowerShell 2
Решение для PowerShell 2 можно найти здесь: https://stackoverflow.com/a/37814462/9447234