2017-08-30 3 views
0

PuTTYとWinSCPのみに限定されています。WinSCPを使用するSFTPサーバーからX日を超えたファイルをダウンロードし、一致するファイルを含まないフォルダをスキップします。

ログファイルを含むログディレクトリをダウンロードしようとしています。たとえば、私はすべてlog_files 6日以上古いものをつかみたい。 log_dir2log_dir3が含まれていますが、log_dir1とそのファイルは一致しません。

DIR/log_dir1/log_files % older than 6 days 
DIR/log_dir2/log_files % meets criteria 
DIR/log_dir3/log_files % meets criteria 

私の問題はlog_dir1log_filesがダウンロードされていない一方で、構文私は現在、ダウンロードにlog_dir1フォルダを使用していますということです。通常、大したことではありませんが、何百ものlog_dirフォルダ(ファイルが6日以上経過するとすべて空です)を話しています。私がコントロールできない理由から、これらの古いログディレクトリをログファイルで移動またはアーカイブすることはできません。

私の質問は単純に、ファイルと同様に6日以上経過したフォルダを無視するように構文を変更する方法です。

get -filemask="*>6D" /DIR/* C:\temp 

私はいくつかのパラメータの組み合わせを試しましたが、ディレクトリマスクとパスマスクに関するサポートページを読んでいます。私はそれらのいずれかを働かせることはできません(バージョンの問題?)。誰でもその文法をhelp pageよりもよく説明できますか?明日私が使用しているWinSCPの現在のバージョンで更新します。

+0

- 実際に何をしたいですか?本当にタイムスタンプに基づいてフォルダを選択したいですか?それは信頼できますか?または、新しいファイルが含まれていないフォルダをスキップしますか? –

+0

Hmm。少なくとも、私は6日より新しいファイルを含まないフォルダをスキップしたいと思っています。上記の構文は正しいファイルを取得しますが、すべてのフォルダも空にします。 – James

+0

はい。私はあなたの答えをupvotedしかし、それは新しいアカウントのために反映されていないマーティン。ありがとう! – James

答えて

0

Time constraint in WinSCP file maskは、ディレクトリには使用できません。


しかし、あなたはPowerShell script with a use of WinSCP .NET assemblyで簡単にこのカスタムロジックを実装できます。

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

# Set up session options 
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{ 
    Protocol = [WinSCP.Protocol]::Sftp 
    HostName = "example.com" 
    UserName = "username" 
    Password = "password" 
    SshHostKeyFingerprint = "..." 
} 

$remotePath = "/remote/path" 
$localPath = "C:\local\path" 
$limit = (Get-Date).AddDays(-6) 

$session = New-Object WinSCP.Session 

# Connect 
$session.Open($sessionOptions) 

# Enumerate files to download 
$fileInfos = 
    $session.EnumerateRemoteFiles(
     $remotePath, $Null, [WinSCP.EnumerationOptions]::AllDirectories) | 
    Where-Object { $_.LastWriteTime -gt $limit } 

foreach ($fileInfo in $fileInfos) 
{ 
    $localFilePath = 
     [WinSCP.RemotePath]::TranslateRemotePathToLocal(
      $fileInfo.FullName, $remotePath, $localPath) 

    # If the corresponding local folder does not exist yet, create it 
    $localFileDir = Split-Path -Parent $localFilePath 
    if (!(Test-Path -Path $localFileDir)) 
    { 
     Write-Host "Creating local directory $localFileDir..." 
     New-Item $localFileDir -ItemType directory | Out-Null 
    } 

    Write-Host "Downloading file $($fileInfo.FullName)..." 

    # Download file 
    $sourcePath = [WinSCP.RemotePath]::EscapeFileMask($fileInfo.FullName) 
    $transferResult = $session.GetFiles($sourcePath, $localFilePath) 

    # Did the download succeeded? 
    if (!$transferResult.IsSuccess) 
    { 
     # Print error (but continue with other files) 
     Write-Host ("Error downloading file ${remoteFilePath}: " + 
      $transferResult.Failures[0].Message) 
    } 
} 

$session.Dispose() 

Write-Host "Done." 

スクリプトを実行します(download.ps1)のように:WinSCPのファイルマスクの時間制約がディレクトリのために使用することはできません

powershell.exe -ExecutionPolicy Unrestricted -File download.ps1 
関連する問題