Войти

Показать полную графическую версию : [решено] Скачать с FTP свежий файл


AZABAZA
17-04-2015, 05:55
Всем доброго времени суток!

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

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

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

AZABAZA
17-04-2015, 09:02
Нашел тут скрипт только он на CMD\BAT script CMD (http://forum.oszone.net/thread-239901.html)

Kazun
17-04-2015, 11:03
Качаем модуль FTP - https://gallery.technet.microsoft.com/scriptcenter/PowerShell-FTP-Client-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
Kazun, не могу понять цель использования фильтра «Where {$_.Name}». Можете пояснить?

Kazun
17-04-2015, 11:17
Есть часть данных, которые не должны попадать в вывод( по крайне мере когда я тестировал).

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
Kazun,
Спасибо, вот только не совсем понятно куда юзера/пароль вбивать ?

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

Kazun
17-04-2015, 11:24
$pass = ConvertTo-SecureString 'PASSOWRD' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("USERNAME",$pass)

AZABAZA
17-04-2015, 11:31
Странно что он скопировал а сообщение выдало что Файл скопировать не удалось! :dont-know

Kazun
17-04-2015, 11:38
Вывод:
$shell.NameSpace($filename).items()

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

AZABAZA
17-04-2015, 11:44
Kazun,

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

Remote-Item $filename -Force поменял на Remove-Item $filename -Force

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

Kazun
17-04-2015, 11:50
Описался)

AZABAZA
17-04-2015, 11:55
Kazun,
Спасибо огромное, не один раз выручаете! =) :clapping: :yahoo:

Iska
17-04-2015, 11:58
Kazun, спасибо, ясно.

AZABAZA
17-04-2015, 12:47
Kazun,

А скажите как можно это исправить?
Rename-Item : Cannot create a file when that file already exists.

Kazun
17-04-2015, 15:00
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
Уважаемый Kazun,

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

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

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

Как-то так.

Спасибо.

Iska
01-03-2017, 08:30
ratibor79, как Вы предполагаете проверку контрольной суммы «на стороне FTP сервера», инициируемую клиентом, если таковой функционал в принципе не входит в протокол?!

ratibor79
01-03-2017, 13:36
Iska, ох, если бы я знал как это реализовать. Просто реально возникают проблемы, если файл/ы не докачиваются.
Вот ссылка (https://winscp.net/eng/docs/library_example_verify_file_checksum), может наведет на мысли.
Ну а в целом, я не настаиваю. Если получиться, прекрасно, если нет, все-равно спасибо.

Iska
01-03-2017, 13:51
ratibor79, только в том случае, если используемый Вами сервер поддерживает эти расширения. Можете зараз взять и проверить той же консолью winscp.com (https://winscp.net/eng/docs/executables) командой checksum (https://winscp.net/eng/docs/scriptcommand_checksum). Если отработает — тогда можно будет играться и с указанной библиотекой WinSCPnet.dll под PowerShell.

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




© OSzone.net 2001-2012