none
Backup на ftp с помощью powershell RRS feed

  • Вопрос

  • Добрый день.

    Подскажите как реализовать:

    На локальном компьютере нужно бэкапить папку со всем ее содержимым. Все нужно отправить на FTP  в папку вида yyyyMMdd.

    После этого проверяем, есть ли на FTP папка, но созданная вчера. И если есть, удаляем файлы на локальном компьютере.

    Import-Module PSFTP 
    $ftp = "ftp://myftp/"

    $user = "Username"
    $ppass = "password"
    $pass = ConvertTo-SecureString $ppass -Force -AsPlainText
    $cred = New-Object Management.Automation.PSCredential($user,$pass)

    $SourcePath = "E:\backup\"

    Set-FTPConnection -Server $ftp -UseBinary -UsePassive -Session my -Credential $cred
    $files = Get-ChildItem $SourcePath *.*
    $files | Add-FTPItem -Session $my

    Работает, но если в папке только файлы. И дальше не понимаю как проверить на фтп.

    27 апреля 2015 г. 6:06

Ответы

Все ответы

  • # Сегодня
    $td = (Get-Date).Date
    $di = $td.ToString("yyyyMMdd")
    # Вчера
    $yd = (Get-Date).Date.AddDays(-1).ToString("yyyyMMdd")
    
    # Создадим папку с текущей датой
    New-FTPItem -Name $di -Session $my
    
    # Скопируем файлы в папку
    Get-ChildItem $SourcePath | Where {$_.LastWriteTime -ge $td -and !$_.PsIsContainter} | Foreach {Add-FTPItem -Path "/$di" -LocalPath $_.FullName  -Session $my}
    
    # Проверяем папку на наличие
    if (Get-FTPChildItem -Session $my -Path $yd) {
    	# Удаляем старые файлы
    	Get-ChildItem $SourcePath  | Where {$_.LastWriteTime -lt $td -and !$_.PsIsContainter} | Remove-Item -Force -Recurse
    }
    else {
    	"Папка с файлами за вчерашний день не найдена!"
    }




    • Изменено KazunEditor 27 апреля 2015 г. 6:38
    27 апреля 2015 г. 6:37
    Отвечающий
  • Да, спасибо.

    Но если в источнике есть вложенные папки выдает:

    Add-FTPItem : Exception calling "OpenRead" with "1" argument(s): "Access to the path 'E:\Backup\New folder' is denied."

    А если только файлы, все ОК.

    27 апреля 2015 г. 9:15
  • В данном  модуле автор не реализовал копирование папок рекурсивно, поэтому если есть желание ждите пока кто-нито напишет.

    Предложу вариант с утилитой ncftpput - http://www.ncftp.com/ncftp/doc/ncftpput.html

    You can upload an entire directory tree of files by using the -R flag. Example: 
    
    $ ncftpput -R pikachu.nintendo.co.jp /incoming /tmp/stuff
    

    27 апреля 2015 г. 10:04
    Отвечающий
  • ncftpput -u username -p password -R ftp://myftp/folder/ E:\backup\

    Походу ошибаюсь, потому что на варианты ключей меня выкидывает..

    27 апреля 2015 г. 14:18
  • ncftpput [flags] remote-host remote-dir local-files...

    ncftpput -u username -p password -R myftp.ru /folder E:\backup

    • Помечено в качестве ответа KazunEditor 28 апреля 2015 г. 12:58
    27 апреля 2015 г. 14:35
    Отвечающий
  • Конечный вариант, что должно быть

    #Исходные параметры

    $path1 = "E:\Sites\"
    $path2 = "E:\Mobiservice\"
    $path3 = "E:\Backup\other\"
    $path4 = "E:\Backup\iis\"
    $path5 = "E:\Backup\"
    $date = Get-Date -f {yyyy_MM_dd}
    $mx = "-mx3"

    #Создадим архивы
    Get-ChildItem $path1 -Force | Foreach {
    &"C:\Program Files\7-Zip\7z.exe" a $mx ("$path4" + "Sites" + "_" + $date + ".zip") $_.FullName
    }

    Get-ChildItem $path2 -Force | Foreach {
    &"C:\Program Files\7-Zip\7z.exe" a $mx ("$path3" + "Mobiservice" + "_" + $date + ".zip") $_.FullName
    }
    #Создание папки на FTP
    #Импортируем модуль PSFTP
    Import-Module PSFTP 

    $ftp = "myftp"
    $user = "user"
    $ppass = "password"
    $pass = ConvertTo-SecureString $ppass -Force -AsPlainText
    $cred = New-Object Management.Automation.PSCredential($user,$pass)
    Set-FTPConnection -Server $ftp -UseBinary -UsePassive -Session my -Credential $cred

    #Переменные дат
    # Сегодня
    $td = (Get-Date).Date
    $di = $td.ToString("yyyy_MM_dd")
    # Вчера
    $yd = (Get-Date).Date.AddDays(-1).ToString("yyyy_MM_dd")

    # Создадим папку с текущей датой
    New-FTPItem -Name $di -Session $my

    #Проверяем наличие папки
    if (Get-FTPChilditem -Session $my -Path $yd) {

    #Если она есть удалить старые файлы из двух директорий
    Get-Childitem $path3 | Where {$_.LastWriteTime -lt $td -and !$_.PslsContainer} | Remove-Item -Force -Recurse
    Get-Childitem $path4 | Where {$_.LastWriteTime -lt $td -and !$_.PslsContainer} | Remove-Item -Force -Recurse

    #И скопировать содержимое на FTP
    cd e:\script\NcFTP
    ncftpput -u username -p password -R myftp /folder E:\Backup\*.*

    }

    else {
    #При отсутствии папки за вчерашний день, выдать ошибку
    "Папка с файлами не найдена"
    }

    Ошибка в if-else. не смотря на то, что папки за вчера на FTP нет, локальные файлы за прошлую дату все равно удаляются. А мне бы так: если есть, удаляем, отправляем; если нет выдает ошибку.

    27 апреля 2015 г. 19:15
  • Вывод :

    Get-FTPChilditem -Session $my -Path $yd

    27 апреля 2015 г. 20:00
    Отвечающий
  • На выходе нет.

    Убирая -Path $yd, обе.

    27 апреля 2015 г. 20:44
  • Заменить строку if (Get-FTPChilditem -Session $my -Path $yd) { на:

    $fy = Get-FTPChilditem -Session $my | Where {$_.Name -eq $yd}
    if ($fy) {

    28 апреля 2015 г. 6:11
    Отвечающий
  • :)

    Огромное спасибо.)

    28 апреля 2015 г. 9:13