Как создать несколько zip-папок (функция) из моего вывода?

Я пытаюсь заархивировать все папки, которые я нахожу в своей папке с именем services.

Я использую Get-Childitem, чтобы найти эти папки, и я хочу добавить функцию после конвейера, но это не работает так, как я хочу. ZIP-файл должен иметь то же имя, что и сама папка, поэтому я попытался указать имя с помощью «$.FullName», а путь назначения — это папка «C:\com\$.Name».

Вот мой сценарий:

Get-ChildItem "C:\com\services" | % $_.FullName 


$folder = "C:\com\services"
$destinationFilePath = "C:\com"

function create-7zip([String] $folder, [String] $destinationFilePath)
{
    [string]$pathToZipExe = "C:\Program Files (x86)\7-Zip\7zG.exe";
    [Array]$arguments = "a", "-tzip", "$destinationFilePath", "$folder";
    & $pathToZipExe $arguments;
}

person RayofCommand    schedule 29.08.2013    source источник


Ответы (2)


Первый. Объявите переменные, такие как папка и путь назначения.

Второй. Измените путь к папке 7zip, как у меня (Program Files).

 #declare variables
    $folder = "C:\com\services"
    $destPath = "C:\destinationfolder\"

    #Define the function
    function create-7zip{
    param([String] $folder, 
    [String] $destinationFilePath)
    write-host $folder $destinationFilePath
    [string]$pathToZipExe = "C:\Program Files\7-Zip\7z.exe";
    [Array]$arguments = "a", "-tzip", "$destinationFilePath", "$folder";
    & $pathToZipExe $arguments;
    }

     Get-ChildItem $folder | ? { $_.PSIsContainer} | % {
     write-host $_.BaseName $_.Name;
     $dest= [System.String]::Concat($destPath,$_.Name,".zip");
     (create-7zip $_.FullName $dest)
     } 

$_.PSIsContainer найдет только папки, создав переменную пути назначения $dest и затем вызвав функцию. Надеюсь, это поможет.

person Mitul    schedule 29.08.2013
comment
эй mitul, очень полезно, единственное, что zip-файлы хранятся в папке, где находится мой скрипт. но наверное разберусь :) - person RayofCommand; 30.08.2013

Если я вас правильно понял, вы хотите направить вывод gci в свою функцию Create-7Zip и заставить функцию создавать zip-файл с именем для каждого каталога, в который вы переходите, например:

gci | ?{ $_.PSIsContainer } | Create-7Zip

Для этого вам понадобится командлет, который вы пишете для поддержки получения значений из конвейера, что вы делаете с атрибутом [Parameter] в своем списке params().

function Create-7Zip
{
  param(
    [Parameter(ValueFromPipeline=$True)]
    [IO.DirectoryInfo]$Directory #we're accepting directories from the pipeline.  Based on the directory we'll get the zip name
    );
    BEGIN
    {
        $7Zip = Join-Path $env:ProgramFiles "7-Zip\7z.exe"; #get executable
    }
    PROCESS
    {
        $zipName = $("{0}.zip" -f $Directory.Name);
        $7zArgs = Write-Output "a" "-tzip" $zipName $directory.FullName; #Q&D way to get an array
        &$7Zip $7zArgs
    }
}



Usage:
    #Powershell 3.0
    get-childitem -directory | Create-7Zip
    #Powershell 2
    get-childitem | ?{ $_.PSIsContainer } | Create-7Zip

Вы увидите вывод 7zip; вы можете получить эту информацию, передав ее куда-то еще.

person David Beiler    schedule 29.08.2013
comment
спасибо, я все еще очень новичок в powershell. поэтому для меня это не сработало так, как я хотел. почему вы идете за исполняемым файлом так, как вы идете? почему бы просто не указать полный путь? Благодарность - person RayofCommand; 30.08.2013
comment
Полный путь был бы в порядке, я просто пытаюсь заменить любые пути Windows их эквивалентами переменных среды, если это возможно. Для программных файлов утилита менее очевидна, но для чего-то вроде временного каталога (обычно c:\Users\‹UserName›\AppData\Local\Temp) использование $env:Temp безопаснее для нескольких пользователей и проще для ввода. - person David Beiler; 30.08.2013
comment
да, конечно, но особенно 7zip имеет 2 разных исполняемых файла в некоторых версиях: 7z.exe, а иногда и 7zG.exe - person RayofCommand; 30.08.2013
comment
Я полагаю, что 7zG дает вам какой-то графический интерфейс для командной строки, обеспечивая при этом ту же функциональность, но я не проверял. - person David Beiler; 30.08.2013