Извлечение каждого ZIP-файла в папке A в отдельные папки (папки создаются вручную и существуют) - PullRequest
0 голосов
/ 11 февраля 2019

У меня PowerShell 4.0 и Windows Server 2012 R2.Я хочу извлечь ZIP файлы (84 файла) в отдельные папки.Я создаю сценарий, который работает нормально, но он жестко запрограммирован, а код слишком длинный для устранения неполадок.Я хочу уменьшить код путем параметризации сценария, чтобы уменьшить количество строк кода.Кто-нибудь может мне с этим помочь?Вот мой сценарий:

Function Get-ShortName {
begin {
$fso = New-Object -ComObject Scripting.FileSystemObject }
process {
If ($_.psiscontainer) {
$fso.getfolder($_.fullname).ShortName }
ELSE {
$fso.getfile($_.fullname).ShortName }
} }

#Formatting today's date
$TodayDate = (Get-Date).ToString('DTyyMMdd')

#Formatting the first day of the month
$Year = (get-date).Year
$Month = (get-date).Month
$FirstDayMth = Get-Date -Year $Year -Month $Month -Day 1
$FirstDayOfMonth = $FirstDayMth.ToString('DTyyMMdd')

#Download Nightly and Monthly files
Get-ChildItem -Path "C:\users\in\FileZIP*_nightly.$TodayDate" -Recurse | Copy-Item -Destination "C:\data_files\Provisioning_Files" -Force -Verbose 
Get-ChildItem -Path "C:\users\in\FileZIP*_monthly.$FirstDayOfMonth" -Recurse | Copy-Item -Destination "C:\data_files\Provisioning_Files" -Force -Verbose

#Unzip files
Add-Type --AssemblyName System.IO.Compression.FileSystem
function Unzip {
param([string]$zipfile, [string]$outpath)
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath) }

#Check if files exist
$checkprovfiles = Get-ChildItem -Path C:\data_files\Provisioning_Files -File
if ($checkprovfiles.Count -eq 84 ) {
echo "Files have been downloaded SUCCESSFULLY. Now we need to Extract them"

Get files shortname
$files = Get-ChildItem "C:\data_files\Provisioning_Files\*.*" | Get-Shortname
Foreach ($file in $files) {
if ($file -eq "FileZIP1_nightly.$TodayDate") {
echo 'Start extracting FileZIP1 nightly files'
Unzip ""C:\data_files\Provisioning_Files\FileZIP1_nightly.$TodayDate" "C:\data_files\Extracted_files\FILEZIP1_Nightly_Monthly_Extracted\"
echo 'Finish extracting FileZIP1 nightly files' }

if ($file -eq "FileZIP1_monthly.$FirstDayOfMonth") {
echo 'Start extracting FileZIP1 monthly files'
Unzip ""C:\data_files\Provisioning_Files\FileZIP1_monthly.$FirstDayOfMonth") "C:\data_files\Extracted_files\FILEZIP1_Nightly_Monthly_Extracted\" 
echo 'Finish extracting FileZIP1 monthly files'

if ($file -eq "FileZIP2_nightly.$TodayDate") {
echo 'Start extracting FileZIP2 nightly files'
Unzip "C:\data_files\Provisioning_Files\FileZIP2_nightly.$TodayDate" "C:\data_files\Extracted_files\FILEZIP2_Nightly_Monthly_Extracted\"
echo 'Finish extracting FileZIP2 nightly files'

if ($file -eq "FileZIP2_monthly.$FirstDayOfMonth") {
echo 'Start extracting FileZIP2 monthly files'
Unzip ""C:\data_files\Provisioning_Files\FileZIP2_monthly.$FirstDayOfMonth") "C:\data_files\Extracted_files\FILEZIP2_Nightly_Monthly_Extracted\"
echo 'Finish extracting SFileZIP2 monthly files' }
.
.
.
if ($file -eq "FileZIP84_nightly.$TodayDate") {
echo 'Start extracting FileZIP84 nightly files'
Unzip "C:\data_files\Provisioning_Files\FileZIP84_nightly.$TodayDate" "C:\data_files\Extracted_files\FILEZIP84_Nightly_Monthly_Extracted\"
echo 'Finish extracting FileZIP84 nightly files' }
}
else {
echo "Provisionning files are incomplete or could not be found on ." 
EXIT }

Я повторил оператор IF 84 раза и не хочу этого делать.Это трудно устранить.Я хочу уменьшить выражение if и не знаю, как это сделать.Кто-нибудь может мне помочь или есть предложение сделать сценарий по-другому?

1 Ответ

0 голосов
/ 11 февраля 2019

Это показывает, как много вещей, происходящих здесь, для такой простой задачи и этих имен zip-файлов, не имеют расширения zip и, следовательно, не рассматриваются файловой системой как zip-файлы.Тем не менее, это ваш выбор, конечно.

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

Каждый раз, когда вы выходите за рамки 3–5 операторов if, пришло время использовать вместо этого «Switch».Посмотрите примеры фрагментов, предоставленных в ISE для этой идеи, или ...

Get-Help -Name About_Switch -Examples
Get-Help -Name About_Switch -Full
Get-Help -Name About_Switch -Online

С этим множеством выборов, хотя, вероятно, пришло время переосмыслить ваш подход.

Ниже не проверено, так как у меня нетТипы файлов, например, те, которые вы показываете, так что настройте их по необходимости.

Для варианта назначения и распакуйте сценарий использования.Попробуйте что-то вроде этого в качестве основы, чтобы начать.Конечно, добавьте любую дополнительную обработку имени ошибки / сообщения / строки, которая вам требуется.

# Unpack archives from source to destination
Function Expand-ZipFile 
{
    [CmdletBinding()]
    [Alias('ezf')]

    <# 
    Set parameters to allow for passing in the function call
    or if a parameter is not passed, prompt the use for it.
    #>

    Param
    (
        [String]$SourcePath = (Read-Host -Prompt 'Enter the full path of a root source folder'),
        [String]$DestinationPath = (Read-Host -Prompt 'Enter the full path to the root destination folder.')
    )

    # Initialize the .Net compression namespace
    Add-Type -AssemblyName System.IO.Compression.FileSystem


    # Get all zipfiles in a source folder.
    'Collecting all the zip files from the source folder.'
    $ZipFiles = Get-ChildItem -Path $Source -Filter '*.zip'

    ForEach ($ZipFile in $ZipFiles)
    {
        <#
        Set the destination name using the destination path and add a sub folder 
        using the basename of the zip file
        #>
        'Initializing zip destination path'
        $ZipPath = New-Item -Path "$DestinationPath\$($ZipFile.BaseName)" -ItemType Directory -WhatIf

        # Extract to zip destination path
        "Extacting zip file to the zip destination path names: $ZipPath"
        [System.IO.Compression.ZipFile]::ExtractToDirectory($($ZipFile.FullName), $($ZipPath.FullName))
    }
}

# .Example use case
Expand-ZipFile -SourcePath 'D:\SourcePath' -DestinationPath 'E:\DestinationPath'

Обновление для OP

Что касается…

Не могли бы вы дать мне пример того, как применить REGEX или SUBSTRING с помощью функции выше.

Снаружи или внутри функции, это просто конвейер в файле, затемприменить строку извлечения.

'FILE1ZIP_nightly_yyyyddmm', 'FILE1ZIP_monthly_yyyymmdd' | %{$_.SubString(0,8)}
FILE1ZIP
FILE1ZIP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...