2016-04-11 5 views
1

J'ai un script PowerShell qui télécharge les fichiers les plus récents des extensions de fichier particulier. Le répertoire FTP contient des centaines de fichiers horaires horodatés (mmddhh) qu'il efface à la fin de chaque heure. Chaque fichier a une extension unique. Je télécharge des fichiers toutes les heures pour les extensions .tn1, .tn2, .tn3, .tn4, .tn5, .ky1 et .nc1. Le fichier est enregistré localement sous la forme extension.txt (par exemple, tn1.txt, tn2.txt, etc.).de script Powershell WinSCP FTP télécharge le fichier mis en cache pour seulement 1 sur 8 fichiers

Le problème que j'ai est que le fichier tn5 qui est téléchargé a une date de création de Décembre 2015 mais sur le serveur il est à jour (avr 2016).

J'ai déjà mis mes options IE à « vérifier les versions plus récentes des pages enregistrées » « chaque fois que je visite la page Web »

Je l'exécution du script de 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

Set 'Session.SessionLogFile' et ajoutez un journal indiquant le téléchargement du fichier' tn5'. –

+0

Le titre indique * "fichier mis en cache pour seulement 1 sur 8 fichiers" *, tandis que le texte indique * "a une date de création de décembre 2015" *. Il n'est pas clair si le problème est juste l'horodatage ou si un contenu du fichier est ancien. Si ce dernier, pouvez-vous télécharger une version à jour du fichier en utilisant un client FTP (GUI)? –

+0

L'horodatage et le contenu du fichier sont anciens, ce qui me porte à croire que mon ordinateur ou peut-être le serveur qui héberge mon lecteur "H" charge une version en cache du fichier. Je vais travailler sur l'obtention d'un journal. – Kyle

Répondre

1

nom de fichier cible est spécifiée par le second argument de l'appel de méthode GetFiles, à savoir le "$localPath\$extension.txt" dans le:

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

Si vous voulez ajouter un « 1 » au nom de base, utilisez "$localPath\${extension}1.txt":

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