FTP скачать несколько файлов с помощью PowerShell - PullRequest
3 голосов
/ 05 января 2012

Я новичок в PowerShell и пытаюсь преобразовать пакетный файл, который загружает несколько файлов на основе имен и расширений из каталога на FTP-сайте. Хотя я нашел несколько примеров загрузки файла, я изо всех сил пытаюсь найти тот, который показывает, как загрузить несколько файлов. В пакете я могу довольно просто использовать ftp.exe и команду mget с подстановочными знаками ??

Может кто-нибудь, пожалуйста, укажите мне правильное направление.

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

Ответы [ 8 ]

1 голос
/ 05 января 2012

Другой ресурс, который вы можете проверить: клиентский модуль PowerShell FTP

http://gallery.technet.microsoft.com/scriptcenter/PowerShell-FTP-Client-db6fe0cb

1 голос
/ 05 января 2012

Есть несколько способов добиться этого.Одним из них является использование System.Net.FtpWebRequest, как показано в этом примере: http://www.systemcentercentral.com/BlogDetails/tabid/143/IndexID/81125/Default.aspx

Или есть / n программных сетевых командлетов, которые можно использовать:

http://www.nsoftware.com/powershell/tutorials/FTP.aspx

1 голос
/ 05 января 2012

В пакете я могу просто использовать ftp.exe и команду mget с подстановочными знаками ??

Вы можете сделать то же самое в Powershell, если хотите.

Для более эффективного использования Powershell вы можете использовать FTPWebRequest. Смотрите здесь: http://msdn.microsoft.com/en-us/library/ms229711.aspx. Вы можете создать пример для загрузки нескольких файлов в цикле.

Но суть в том, что вам не нужно конвертировать то, что у вас есть в пакетном режиме, в Powershell. Вы можете, если хотите, но то, что у вас есть в пакетном режиме, особенно при вызове внешних программ, должно работать точно так же.

0 голосов
/ 21 декабря 2013

Список файлов может быть создан в переменной и использоваться с обычной командой FTP ....

$FileList="file1_$cycledate.csv
file2_$cycledate.csv
file3_$cycledate.csv
file4_$cycledate.csv"

"open $FTPServer
    user $FTPUser $FTPPassword
ascii
cd report
" +
($filelist.split(' ') | %{ "mget $_" }) | ftp -i -n
0 голосов
/ 16 августа 2013

Это не специфично для Powershell.Но я пробовал много других решений и до сих пор

Клиент http://ncftp.com/ работает лучше всего.Он поставляется с ncftpls.exe для отображения удаленных файлов и ncftpget.exe для получения файлов.Используйте их с Start-Process -Wait

0 голосов
/ 30 июля 2013

Это то, что я сделал. Поскольку мне нужно было загрузить файл на основе шаблона, я динамически создал командный файл, а затем позволил ftp делать все остальное, я использовал основные команды powershell.мне не нужно было загружать какие-либо дополнительные компоненты. Сначала я проверил, существует ли необходимое количество файлов.если они это сделают, я вызываю FTP во второй раз с Mget.Я запускаю это с сервера Windows 2008, подключающегося к удаленному серверу Windows XP

            function make_ftp_command_file($p_file_pattern,$mget_flag)
               {
               # This function dynamically prepares the FTP file
               # The file needs to be prepared daily because the pattern changes daily
               # Powershell default encoding is Unicode
               # Unicode command files are not compatible with FTP so we need to make sure we create an  ASCII File

               write-output "USER" | out-file -filepath C:\fc.txt -encoding ASCII
               write-output "ftpusername" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               write-output "password" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               write-output "ASCII" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               If($mget_flag -eq "Y")
               {
                  write-output "prompt" | out-file -filepath C:\fc.txt -encoding ASCII -Append
                  write-output "mget $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               }
               else
               {
                  write-output "ls $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               }          

               write-output quit | out-file -filepath C:\fc.txt -encoding ASCII -Append

            }

            ###########################  Init Section ###############################
            $yesterday = (get-date).AddDays(-1)
            $yesterday_fmt = date $yesterday -format "yyyyMMdd"
            $file_pattern = "BRAE_GE_*" + $yesterday_fmt + "*.csv"
            $file_log = $yesterday_fmt + ".log"

            echo  $file_pattern
            echo  $file_log



            ############################## Main Section ############################
            # Change location to folder where the files need to be downloaded
            cd c:\remotefiles

            # Dynamically create the FTP Command to get a list of files from the Remote Servers
            echo "Call function that creates a FTP Command "
            make_ftp_command_file $file_pattern N


            #echo "Connect to remote site via FTP"
            # Connect to Remote Server and get file listing
            ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log

            $matches=select-string -pattern "BRAE_GE_[A-Z][A-Z]*" C:\logs\$file_log

            # Check if the required number of Files available for download
            if ($matches.count -eq 36)
            {
                # Create the ftp command file
                    # this time the command file has an mget rather than an ls
                make_ftp_command_file $file_pattern Y
                    # Change directory if not done so
                cd c:\remotefiles
                    # Invoke Ftp with newly created command file
                ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log 
            }
            else
            {
                echo "Full set of Files not available"
            }
0 голосов
/ 16 августа 2012

@ Jacob. Вам нужен метод :: ListDirectory, чтобы составить список. После этого вы должны вывести его в текстовом файле с помощью команды out-file. После этого вы импортируете список с помощью команды get-content. Итак, с помощью текстового файла вы можете создать коллекцию объектов с циклом foreach (не забудьте пропустить последнюю строку с условием '-cne'). Вы включаете в этот цикл свою функцию download-ftp с параметром вашего цикла. Понял? Не уверен, что мое объяснение хорошо.

Итак, есть пример из одного из моих сценариев:

$files = Get-FtpList $ftpSource $ftpDirectory $ftpLogin $ftpPassword | Out-File -Encoding UTF8 -FilePath list.txt

$list = Get-Content -Encoding UTF8 -Path list.txt

foreach ($entry in $list -cne "")
{
Get-FtpFile $ftpSource $ftpDirectory $entry $target $ftpLogin $ftpPassword
Start-Sleep -Milliseconds 10
}

Надеюсь, теперь это работает для вас.

PS: Get-FtpList и Get-FtpFile являются пользовательскими функциями.

0 голосов
/ 05 января 2012

Как ни странно, нет встроенных командлетов для работы с FTP.Я не уверен, почему команда PowerShell приняла такое решение, но это означает, что вам придется полагаться на использование кода .NET, стороннего скрипта / модуля / оснастки или программы Win32, такой как FTP.exe, как уже сделали другиеответил.

Вот пример загрузки нескольких файлов (двоичных и текстовых) с использованием кода .NET:

$files = "Firefox Setup 9.0.exe", "Firefox Setup 9.0.exe.asc"
$ftpFolder = 'ftp://ftp.mozilla.org/pub/firefox/releases/9.0/win32/en-US'
$outputFolder = (Resolve-Path "~\My Documents").Path

foreach ($file in $files) {
    try {
        $uri = $ftpFolder + '/' + $file
        $request = [Net.WebRequest]::Create($uri)
        $request.Method = [Net.WebRequestMethods+Ftp]::DownloadFile
        $responseStream = $request.GetResponse().GetResponseStream()

        $outFile = Join-Path $outputFolder -ChildPath $file
        $fs = New-Object System.IO.FileStream $outFile, "Create"

        [byte[]] $buffer = New-Object byte[] 4096

        do {
            $count = $responseStream.Read($buffer, 0, $buffer.Length)
            $fs.Write($buffer, 0, $count)
        } while ($count -gt 0)

    } catch {
        throw "Failed to download file '{0}/{1}'. The error was {2}." -f $ftpFolder, $file, $_
    } finally {
        if ($fs) { $fs.Flush(); $fs.Close() }
        if ($responseStream) { $responseStream.Close() }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...