Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скачать с FTP свежий файл (http://forum.oszone.net/showthread.php?t=298497)

AZABAZA 17-04-2015 05:55 2496910

Скачать с FTP свежий файл
 
Всем доброго времени суток!

Возникла нужда, скачать файлы с FTP. Прошу всех кто связывался с этим помочь. Спасибо заранее!

Задача:
1. подключится к FTP
2. Скачать свежий *.ZIP файл с FTP на локальный компьютер.
3. Распаковать *.ZIP в файл.
4. Поменять расширение (Пример.exe на .bat)
5. удалить *.ZIP файл с локального компьютера
6. Закрыть с сообщением файл успешно скопирован!

Еще раз спасибо заранее!

AZABAZA 17-04-2015 09:02 2496959

Нашел тут скрипт только он на CMD\BAT script CMD

Kazun 17-04-2015 11:03 2496998

Качаем модуль FTP - https://gallery.technet.microsoft.co...lient-db6fe0cb

Код:

# Импортируем модуль
Import-module C:\PSFTP

# Папка для файлов
$folder = "C:\test"

# Подключение к фтп
$pass = ConvertTo-SecureString 'ftp' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("ftp",$pass)
Set-FTPConnection -Credentials $cred -Server ftp://ftp.contoso.ru -Session Session -UsePassive

# Скачиваем файл
Get-FTPChildItem zipfiles/*.zip -Session $Session | Where {$_.Name} | Sort ModifiedDate | Select -Last 1 | Foreach {
        $filename = "$folder\$($_.Name)"
        $r = Get-FTPItem -Path $_.FullName -Session $Session -LocalPath $filename -Overwrite
       
        if(Test-Path $filename) {
                $shell = New-Object -ComObject Shell.Application
                $zip = $shell.NameSpace($filename).items()
                try {
                        $shell.Namespace($folder).CopyHere($zip)
                        Get-Item "$folder\$($zip.Item(0).Name)" | Rename-Item -NewName {$_.basename + ".bat"}
                        Remote-Item $filename -Force
                        Write-Host "Файл успешно скопирован!" -ForeGround Yellow
                }
               
                catch {
                        Write-Host "Файл скопировать не удалось!" -ForeGround Red
                }
        }
}


Iska 17-04-2015 11:13 2497003

Kazun, не могу понять цель использования фильтра «Where {$_.Name}». Можете пояснить?

Kazun 17-04-2015 11:17 2497005

Есть часть данных, которые не должны попадать в вывод( по крайне мере когда я тестировал).

Код:

PS > Get-FTPChildItem ubuntu-releases/15.04/*.torrent -Session $Session | Sort ModifiedDate


  Parent: ftp://mirror.yandex.ru/ubuntu-releases/15.04

Dir Right    Ln  User  Group  Size  ModifiedDate        Name
--- -----    --  ----  -----  ----  ------------        ----
-  rw-rw-r-- 1  ftp    ftp    43KB  26.03.2015 22:24:00 ubuntu-15.04-beta2-desktop-amd64.iso.torrent
-  rw-rw-r-- 1  ftp    ftp    45KB  26.03.2015 22:24:00 ubuntu-15.04-beta2-desktop-i386.iso.torrent
-  rw-rw-r-- 1  ftp    ftp    24KB  26.03.2015 22:28:00 ubuntu-15.04-beta2-server-amd64.iso.torrent
-  rw-rw-r-- 1  ftp    ftp    24KB  26.03.2015 22:28:00 ubuntu-15.04-beta2-server-i386.iso.torrent
ftp://mirror.yandex.ru/ubuntu-releases/15.04/ubuntu-15.04-beta2-desktop-amd64.iso.torrent


PS > Get-FTPChildItem ubuntu-releases/15.04/*.torrent -Session $Session | Sort ModifiedDate | Select -L
ast 1
ftp://mirror.yandex.ru/ubuntu-releases/15.04/ubuntu-15.04-beta2-desktop-amd64.iso.torrent

PS > Get-FTPChildItem ubuntu-releases/15.04/*.torrent -Session $Session | Where {$_.Name} | Sort Modifi
edDate | Select -Last 1


  Parent: ftp://mirror.yandex.ru/ubuntu-releases/15.04

Dir Right    Ln  User  Group  Size  ModifiedDate        Name
--- -----    --  ----  -----  ----  ------------        ----
-  rw-rw-r-- 1  ftp    ftp    24KB  26.03.2015 22:28:00 ubuntu-15.04-beta2-server-amd64.iso.torrent


AZABAZA 17-04-2015 11:23 2497012

Kazun,
Спасибо, вот только не совсем понятно куда юзера/пароль вбивать ?

Код:

"The remote server returned an error: (530) Not logged in."

Kazun 17-04-2015 11:24 2497014

$pass = ConvertTo-SecureString 'PASSOWRD' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("USERNAME",$pass)

AZABAZA 17-04-2015 11:31 2497019

Странно что он скопировал а сообщение выдало что
Код:

Файл скопировать не удалось!
:dont-know

Kazun 17-04-2015 11:38 2497023

Вывод:
$shell.NameSpace($filename).items()

$filename - заменить на путь к скаченному архиву.

AZABAZA 17-04-2015 11:44 2497031

Kazun,

я не менял что выше написали, а

Код:

Remote-Item $filename -Force
поменял на
Код:

Remove-Item $filename -Force
Вывод: Файл успешно скопирован!
Это нормально?

Kazun 17-04-2015 11:50 2497039

Описался)

AZABAZA 17-04-2015 11:55 2497044

Kazun,
Спасибо огромное, не один раз выручаете! =) :clapping: :yahoo:

Iska 17-04-2015 11:58 2497047

Kazun, спасибо, ясно.

AZABAZA 17-04-2015 12:47 2497085

Kazun,

А скажите как можно это исправить?
Код:

Rename-Item : Cannot create a file when that file already exists.

Kazun 17-04-2015 15:00 2497142

Код:

Get-Item "$folder\$($zip.Item(0).Name)" | Rename-Item -NewName {
        $file = $_.DirectoryName + "\" + $_.basename + ".bat"
        if(Test-Path $file) {Remove-Item $file -Force}
        $file
}


ratibor79 01-03-2017 07:53 2715585

Уважаемый Kazun,

возможно ли добавить в скрип механизм проверки контрольной суммы (checksum), скажем MD5 или SHA1 (не важно)?

Скрипт хороший, удобный и весьма простой, но при перекачки файлов больших объемов без проверки контрольной суммы весьма проблематично, особенно если после перекачки файла с ним проводятся какие-либо действия.

Было бы полезным, если бы в скрип добавили возможность проверки контрольной суммы и на стороне FTP сервера и на стороне клиента (локально) и в случае, если чексуммы не совпадают, то, например, отправлять уведомление на почту и прерывать дальнейшую обработку скрипта. В случае же, если чексуммы совпадают, то продолжается дальнейшая обработка скрипта.

Как-то так.

Спасибо.

Iska 01-03-2017 08:30 2715594

ratibor79, как Вы предполагаете проверку контрольной суммы «на стороне FTP сервера», инициируемую клиентом, если таковой функционал в принципе не входит в протокол?!

ratibor79 01-03-2017 13:36 2715686

Iska, ох, если бы я знал как это реализовать. Просто реально возникают проблемы, если файл/ы не докачиваются.
Вот ссылка, может наведет на мысли.
Ну а в целом, я не настаиваю. Если получиться, прекрасно, если нет, все-равно спасибо.

Iska 01-03-2017 13:51 2715690

ratibor79, только в том случае, если используемый Вами сервер поддерживает эти расширения. Можете зараз взять и проверить той же консолью winscp.com командой checksum. Если отработает — тогда можно будет играться и с указанной библиотекой WinSCPnet.dll под PowerShell.

Проверьте и отпишитесь здесь по результатам.


Время: 17:05.

Время: 17:05.
© OSzone.net 2001-