2016-10-13 16 views
-1

こんにちはすべて私はパワーシェルスクリプトに慣れています。私はルートディレクトリのすべてのファイルとFTPサーバのファイル名に基づいてサブフォルダ内のファイルをダウンロードしようとしています。私のパスは常にルートディレクトリを指し、ルートディレクトリはテキストファイルとサブフォルダを持っているので、サブフォルダにはテキストファイルが含まれています。FTPサーバからファイルを再帰的にダウンロード

私は、ftpサーバからローカルにダウンロードするテキストファイルを取得する例を見つけましたが、私が見つけた例では、ルートディレクトリからサブフォルダをスキャンしていないテキストファイルをダウンロードしています。ここで

私は再帰的には、Get-ftpchilditem機能のようなモジュールPSFTPモジュールの機能を試してみましたが、それは私のために働いていない私は

# $url = "ftp://XXX.com/" 
    $user = 'UserName' 
    $pass = 'Password' 
    $folder = 'FTP_Folder' 
    $target = "C:\Folder\Folder1\" 

    #SET CREDENTIALS 
    $credentials = new-object System.Net.NetworkCredential($user, $pass) 

    function Get-FtpDir ($url,$credentials) { 
     $request = [Net.WebRequest]::Create($url) 
     $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory 
     if ($credentials) { $request.Credentials = $credentials } 
     $response = $request.GetResponse() 
     $reader = New-Object IO.StreamReader $response.GetResponseStream() 
     $reader.ReadToEnd() 
     $reader.Close() 
     $response.Close() 
    } 

    #SET FOLDER PATH 
    $folderPath= $ftp + "/" + $folder + "/" 

    $Allfiles=Get-FTPDir -url $folderPath -credentials $credentials 
    $files = ($Allfiles -split "`r`n") 

    $files 

    $webclient = New-Object System.Net.WebClient 
    $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) 
    $counter = 0 
    foreach ($file in ($files | where {$_ -like "*.txt"})){ 
     $source=$folderPath + $file 
     $destination = $target + $file 
     $webclient.DownloadFile($source, $target+$file) 

     #PRINT FILE NAME AND COUNTER 
     $counter++ 
     $counter 
     $source 
    } 

を試みた例です。

FTPサーバーのローカルフォルダーとサブフォルダーからローカルシステムにファイルを取得するのを手伝ってください。

答えて

1

私は過去にWinSCPとSFTPを使って行ってきました。以下にその例を示します。これは、基本的にSSHを上回るSFTP SCPを使用します。 WInSCPプロトコルをftpに変更して別の組み合わせを試すことができると確信しています。これがあなたを助けることを願っています.txtだけを含めるようにFileMasksを変更すると、これはサブフォルダを通過します。また、これを動作させるには、WinSCPサイトから簡単にダウンロードできるWinSCPnet.dllとWinSCP.exeが必要です。 ".Net Assembly/COM Library"をダウンロードし、スクリプトと必要なファイルを同じフォルダに保存し、スクリプトのパスを更新します。がんばろう。

# Load WinSCP .NET assembly 
Add-Type -Path "C:\Users\administrator.AD\Documents\WinSCP Script\WinSCPnet.dll" 


$hostname = "ftp.xyz.net" 
$user = "me" 
$pass = "mypassword" 
$sfolder = "/home/me" 
$dfolder = "C:\tmp" 
$sshHostKeyFingerprint = "ssh-rsa 2048 eb:2c:f9:ab:19:2e:0c:22:02:d4:8f:64:44:75:ec:04" 
$mask = "*.jpg;*.jpeg;*.png;*.tiff;*.txt" 
####################### END USER CONFIGURABLE SETTINGS ######################### 

# Main script 
# Setup session options 

$sessionOptions = New-Object WinSCP.SessionOptions -Property @{ 

Protocol = [WinSCP.Protocol]::Scp 

HostName = $hostname 

UserName = $user 

Password = $pass 

SshHostKeyFingerprint = $sshHostKeyFingerprint 

} 


$session = New-Object WinSCP.Session 

$transferOptions = New-Object WinSCP.TransferOptions 

$transferOptions.FileMask = "*.jpg; *.jpeg; *.png; *.tiff;" 

try 

{ 
# Will continuously report progress of synchronization 

$session.add_FileTransferred({ FileTransferred($_) }) 

# Connect 

$session.Open($sessionOptions) 

# Synchronize files 

$synchronizationResult = $session.SynchronizeDirectories(

[WinSCP.SynchronizationMode]::Local,$dfolder, $sfolder, $False, $False, 1, $transferOptions) 

# Throw on any error 

$synchronizationResult.Check() 

} 

finally 

{ 

# Disconnect, clean up 

$session.Dispose() 

} 
+0

ありがとうございました。これは非常に参考になります。 – cooluser505

+0

こんにちはJunidここで私が言及し、私を助けて下のシナリオを見てください...事前に感謝 – cooluser505

関連する問題