Как я могу рекурсивно архивировать каждый файл в папке в PowerShell? - PullRequest
1 голос
/ 29 июля 2011

У меня есть папка, в которой много файлов и папок.Я хочу отправить эту папку на удаленный хост через FTP.я думаю, что клиент windows ftp не может этого сделать, поэтому я решил заархивировать все файлы (в какой-нибудь zip или что-то еще) и затем отправить один файл по ftp.как я могу сделать это в powershell (2.0)?сжатие не важно, важно, чтобы там был только 1 файл.

заранее спасибо.

Ответы [ 3 ]

1 голос
/ 30 июля 2011

Таким образом, вы можете получить файлы вашей папки рекурсивно. После этого вы можете добавить их в свой ziparchive и отправить их по FTP. Powershell не имеет функции для архивирования файлов. Но есть некоторые внешние инструменты. Хорошо это командная строка из 7zip и dll SharpZipLib.

$itemslist = Get-ChildItem C:\\folder -recurse
$filelist = New-Object System.Collections.ArrayList

foreach ($item in $itemslist)
{
    if ($item.GetType().FullName -eq 'System.IO.FileInfo')
    {
        $filelist.Add($item)
    }
}

foreach ($file in $filelist)
{
    //Add file to your ZipArchive
}

//Send ZipArchive
0 голосов
/ 03 августа 2011

Очень просто, используя DotNetZip .

[System.Reflection.Assembly]::LoadFrom("c:\\dev\dotnet\\Ionic.Zip.dll");

$directoryToZip = "c:\\temp";
$zipfile = new-object Ionic.Zip.ZipFile;
$zipfile.AddEntry("Readme.txt", "This is a zipfile created from within powershell.")
$zipfile.AddDirectory($directoryToZip, "home")
$zipfile.Save("ZipFiles.ps1.out.zip");
$zipfile.Dispose();

Объект ZipFile выполняет рекурсию за вас, как часть метода ZipFile.AddDirectory () .

DotNetZip - бесплатная библиотека.


Один дополнительный комментарий - у меня была причина делать FTP-загрузки в прошлом, как часть выпуска программного обеспечения.Я обнаружил, что при последующих загрузках большинство файлов не изменилось.Поэтому я ввел файл «оглавления», в котором хэш MD5 каждого файла сопоставлялся с его именем.Перед загрузкой я загружал оглавление, а затем сравнивал каждый MD5 в таблице с MD5 файла на диске.Если они совпадают, то нет необходимости загружать этот конкретный файл.Это сэкономило много времени и передачу данных.

Хотя у меня нет сценария powershell для этого.<</p>

0 голосов
/ 29 июля 2011

Может быть, это может вам помочь: http://tasteofpowershell.blogspot.com/2008/08/recursion-in-powershell.html

...