2016-04-11 39 views
1

特定のファイル拡張子の最新のファイルをダウンロードするPowerShellスクリプトがあります。 FTPディレクトリには、毎時間の最後に何百ものタイムスタンプ付きファイル(mmddhh)がクリアされています。各ファイルには固有の拡張子が付いています。拡張子のファイルを毎時ダウンロードしています.tn1,.tn2,,.tn4,.tn5,.ky1および.nc1です。Powershell WinSCP FTPスクリプトは、8つのファイルのうち1つのみキャッシュされたファイルをダウンロードしています

ファイルは、extension.txt(たとえば、tn1.txttn2.txtなど)としてローカルに保存されます。

私が抱えている問題は、ダウンロードされるtn5ファイルの作成日が2015年12月ですが、現在のサーバー(2016年4月)です。

は、私はすでに「『たびに私は、Webページを訪問する』「保存しているページの新しいバージョンをチェックするために私のIEのオプションを設定している

私はVBAからスクリプトを実行している:。

Shell("powershell ""H:\Worksheets\FTP\FTP.ps1""", vbHide) 
try 
{ 
    # Load WinSCP .NET assembly 
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" 
    $localPath = "H:\Worksheets\FTP" 
    $remotePath = "/outgoing/data/LatestData/" 
    # Setup session options 
    $sessionOptions = New-Object WinSCP.SessionOptions 
    $sessionOptions.Protocol = [WinSCP.Protocol]::ftp 
    $sessionOptions.HostName = 
    $sessionOptions.UserName = 
    $sessionOptions.Password = 

    $session = New-Object WinSCP.Session 

    try 
    { 
     # 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} | 
      Where-Object { 
       [System.IO.Path]::GetExtension($_.Name) -eq ".nc1" -or 
       [System.IO.Path]::GetExtension($_.Name) -eq ".ky1" -or 
       [System.IO.Path]::GetExtension($_.Name) -like ".tn*" } 

     Group-Object { [System.IO.Path]::GetExtension($_.Name) } | 
      ForEach-Object{ 
       $_.Group | Sort-Object LastWriteTime -Descending | Select -First 1 
      } 

     $extension = [System.IO.Path]::GetExtension($latest.Name) 
     "GetExtension('{0}') returns '{1}'" -f $fileName, $extension 

     if ($latest -eq $Null) 
     { 
      Write-Host "No file found" 
      exit 1 
     } 

     $latest | ForEach-Object{ 
      $extension = ([System.IO.Path]::GetExtension($_.Name)).Trim(".") 
      $sourcePath = [WinSCP.RemotePath]::EscapeFileMask($remotePath + $_.Name) 
      $session.GetFiles($sourcePath, "$localPath\$extension.txt").Check() 
     } 

     $stamp = $(Get-Date -f "yyyy-MM-dd-HHmm") 
     $filename = $stamp.subString(0,$stamp.length-6) 
     $session.GetFiles(
      ($remotePath + $fileName), 
      ($localPath + $fileName + "." + $stamp)).Check() 
    } 
    finally 
    { 
     # Disconnect, clean up 
     $session.Dispose() 
    } 

    exit 0 
} 
catch [Exception] 
{ 
    Write-Host $_.Exception.Message 
    exit 1 
} 
+0

設定 'Session.SessionLogFile'と' tn5'ファイルのダウンロードを示すログを追加します。 –

+0

タイトルに「* 8ファイルのうち1フ​​ァイルのみのキャッシュファイル」*が表示され、テキストには「2015年12月の作成日」が記載されています。問題がタイムスタンプだけであるのか、ファイルの内容が古いのかははっきりしない。後者の場合は、任意の(GUI)FTPクライアントを使用してファイルの最新バージョンをダウンロードできますか? –

+0

タイムスタンプとファイルの内容が古いので、私のコンピュータ、または私の "H"ドライブをホストしているサーバがキャッシュされたファイルをロードしていると思われます。私はログを取得するために動作します。 – Kyle

答えて

1

ターゲット・ファイル名がで"$localPath\$extension.txt"すなわち、GetFilesメソッド呼び出しの第2引数で指定されています

$sourcePath = [WinSCP.RemotePath]::EscapeFileMask($remotePath + $_.Name) 
$session.GetFiles($sourcePath, "$localPath\$extension.txt").Check() 

あなたは、ベース名に「1」を追加"$localPath\${extension}1.txt"を使用する場合:

$sourcePath = [WinSCP.RemotePath]::EscapeFileMask($remotePath + $_.Name) 
$session.GetFiles($sourcePath, "$localPath\${extension}1.txt").Check() 
関連する問題