2016-11-28 119 views
5

私はPowerShellスクリプトを作成しています。このスクリプトはFTPサイトからファイルを取得します。ファイルは毎時FTPサイトにアップロードされるので、最新のファイルをダウンロードする必要があります。私が現在持っているコードは、ただ一つのファイルではなく、今日からすべてのファイルをダウンロードしています。最新のファイルのみをダウンロードするにはどうすればよいですか?ここで PowerShellを使用してFTPから最新のファイルをダウンロード

は、私は現在、それは FtpWebRequestと簡単ではありません

$ftpPath = 'ftp://***.***.*.*' 
$ftpUser = '******' 
$ftpPass = '******' 
$localPath = 'C:\Temp' 
$Date = get-date -Format "ddMMyyyy" 
$Files = 'File1', 'File2' 

function Get-FtpDir ($url, $credentials) 
{ 
    $request = [Net.FtpWebRequest]::Create($url) 
    if ($credentials) { $request.Credentials = $credentials } 
    $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory 
    (New-Object IO.StreamReader $request.GetResponse().GetResponseStream()) -split "`r`n" 

} 

$webclient = New-Object System.Net.WebClient 
$webclient.Credentials = New-Object System.Net.NetworkCredential($ftpUser,$ftpPass) 
$webclient.BaseAddress = $ftpPath 

Foreach ($item in $Files) 
{ 
    Get-FTPDir $ftpPath $webclient.Credentials | 
     ? { $_ -Like $item+$Date+'*' } | 
     % { 

      $webClient.DownloadFile($_, (Join-Path $localPath $_)) 
     } 
} 

答えて

8

を使用していたコードです。あなたの仕事のために、あなたはファイルのタイムスタンプを知る必要があります。

残念ながら、FTP MLSDコマンドをサポートしていないため、FtpWebRequest /.NET framework/PowerShellの機能を使用してタイムスタンプを取得する方法はありません。 MLSDコマンドは、標準化された機械可読フォーマットのリモートディレクトリのリストを提供します。コマンドとフォーマットはRFC 3659で標準化されています。 .NETフレームワークによってサポートされていますが、使用することができます

代替、:

  • ListDirectoryDetails方法(FTP LISTコマンド)ディレクトリ内のすべてのファイルの詳細情報を取得し、あなたがFTPサーバーの特定のフォーマットに対応するため(* nix形式はlsに似ています* nixコマンドが最も一般的ですが、欠点は時間の経過とともに変更される可能性があります。新しいファイル "May 8 17:48"形式が使用され、古いファイル "10月18 2009 "形式を使用)
  • GetDateTimestampメソッド(FTP MDTMコマンド)を個別にret各ファイルのタイムスタンプをrieveします。利点は、応答がRFC 3659YYYYMMDDHHMMSS[.sss]によって標準化されていることです。欠点は、ファイルごとに別々のリクエストを送信する必要があることです。これは非常に非効率的です。

いくつかの参照:

また

は、MLSDコマンドをサポートし、サードパーティFTPライブラリを使用し、 nd /または独自のリスト形式の構文解析をサポートしています。

たとえば、WinSCP .NET assemblyは、両方をサポートします。

コード例:完全なコードについて

# Load WinSCP .NET assembly 
Add-Type -Path "WinSCPnet.dll" 

# Setup session options 
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{ 
    Protocol = [WinSCP.Protocol]::Ftp 
    HostName = "example.com" 
    UserName = "user" 
    Password = "mypassword" 
} 

$session = New-Object WinSCP.Session 

# Connect 
$session.Open($sessionOptions) 

# Get list of files in the directory 
$directoryInfo = $session.ListDirectory($remotePath) 

# Select the most recent file 
$latest = 
    $directoryInfo.Files | 
    Where-Object { -Not $_.IsDirectory } | 
    Sort-Object LastWriteTime -Descending | 
    Select-Object -First 1 

# Any file at all? 
if ($latest -eq $Null) 
{ 
    Write-Host "No file found" 
    exit 1 
} 

# Download the selected file 
$sourcePath = [WinSCP.RemotePath]::EscapeFileMask($remotePath + $latest.Name) 
$session.GetFiles($sourcePath, $localPath).Check() 

Downloading the most recent file (PowerShell)を参照。

(私はWinSCPのの著者です)

+2

WinSCPのは、非常に有用と非常に信頼性の高い:) – Jimbo

+1

WinSCPの岩です。 PowerShellを使用したFTP転送の場合、非常に効率的です。 – sodawillow

関連する問題