2016-07-27 29 views
3

FTPサーバーにアクセスするスクリプトを作成してから、X日より古いファイル*.zipをすべて削除する必要があります。X日より古いファイルをPowerShellまたはバッチファイルのFTPサーバーから削除する

説明:スクリプトはFTPサーバー上で実行できません。私は次に何をするために必要なものに

$ftpServer = "RandomFTPServer" 
$ftpUser = "Username" 
$ftpPassword = Read-Host "Password" -AsSecureString 

$credentials = New-ObjectSystem.Net.NetworkCredential($ftpUser, $ftpPassword) 

function Get-FtpRequest($ftpPath) { 
    $ftpRequest = [System.Net.FtpWebRequest]::Create("$ftpServer/$ftpPath") 
    $ftpRequest.Credentials = $credentials 
    $ftpRequest.UseBinary = $true 
    $ftpRequest.KeepAlive = $true 
    $ftpRequest.UsePassive = $true 
    return $ftpRequest 
} 

任意のヒント:

これは私がこれまで持っているものでしょうか?

+2

あなたは何もしないで接続するので、私はより多くのコードを手に入れているはずです。 –

答えて

1

リモートファイルのタイムスタンプを取得して古いものを選択する必要があります。

残念ながら、FTP MLSDコマンドをサポートしていないため、.NETフレームワーク/ PowerShellの機能を使用してタイムスタンプを取得する方法はありません。

だからあなたが使用し、次のいずれかのディレクトリ内のすべてのファイルの詳細を取得するために

  • ListDirectoryDetails方法(FTP LISTコマンド)を、次にあなたがlsに似た内容のFTPサーバ固有のフォーマット(* nixのフォーマットを扱います* nixコマンドは最も一般的な欠点ですが、新しいファイル "May 8 17:48"形式が使用され、古いファイル "Oct 18 2009"形式が使用されているように、フォーマットは時間とともに変化する可能性があります)
  • GetDateTimestampメソッド(FTP MDTMコマンド)を使用して、各ファイルのタイムスタンプを個別に取得します。利点は、応答がRFC 3659YYYYMMDDHHMMSS[.sss]によって標準化されていることです。欠点は、ファイルごとに別々のリクエストを送信しなければならないことです。これは非常に非効率的です。

別の方法としては、近代的なMLSDコマンドをサポートおよび/または内蔵されていLISTコマンドの異なるフォーマットを解析するためのサポートサードパーティ製FTPクライアントの実装を使用することができます。

たとえば、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 = "ftp.example.com" 
    UserName = "username" 
    Password = "password" 
} 

try 
{ 
    # Connect 
    $session = New-Object WinSCP.Session 
    $session.Open($sessionOptions) 

    # List files 
    $remotePath = "/remote/path" 
    $directoryInfo = $session.ListDirectory($remotePath) 

    # Find old files 
    $limit = (Get-Date).AddDays(-15) 

    $oldFiles = 
     $directoryInfo.Files | 
     Where-Object { -Not $_.IsDirectory } | 
     Where-Object { $_.LastWriteTime -lt $limit } 

    # Delete them 
    foreach ($oldFileInfo in $oldFiles) 
    { 
     $oldFilePath = 
      [WinSCP.RemotePath]::EscapeFileMask($remotePath + "/" + $oldFileInfo.Name) 
     $session.RemoveFiles($oldFilePath).Check() 
    } 

    Write-Host "Done" 
} 
finally 
{ 
    # Disconnect, clean up 
    $session.Dispose() 
} 

あなたはプレーンなバッチファイルを使用して行うことができれば、それはさらに簡単WinSCP scriptingと、実際には:

winscp.com /ini=nul /log=delete.log /command^
    "open ftp://username:[email protected]/"^
    "rm /remote/path/*<15D"^
    "exit" 

file masks with time constraintsを参照してください。

(私はWinSCPのの著者です)

+0

悲しいことに、サードパーティ製のソフトウェアを使用することは許されません.Powershell(.net)、Batch、FTP Batchを使用することのみが許可されています。 – PJS

+0

私が "ListDirectoryDe​​tails"で持っていた問題の1つは、フォルダ階層の下位にあるフォルダやファイルに対して、 "-recurse"パラメータに似たものが見つからないということです。 – PJS

+0

WinSCPにはインストールは必要ありません。そのため、バイナリファイルをバッチファイルまたはPowerShellスクリプトでコピーすることができます。 –

0

私は現在、一緒にバッチファイルで、FTPUSE、窓のドライブ文字にFTPフォルダをマップするフリーウェアのコマンドラインツールを使用して、これをやっています次のようにします。Windows XP、Vistaでは、7、Server 2003では、Server 2008の、Windowsの8、Server 2012のおよびWindows 10(32ビット、64:

: delete files older than 7 days from ftp://my.ftpsite.net/folder/subfolder 
ftpuse F: my.ftpsite.net password /USER:username 
timeout /t 5 
forfiles -p "F:\folder\subfolder" -s -m *.* -d -7 -c "cmd /C DEL @File /Q" 
ftpuse F: /DELETE 

ソフトウェアは、Windowsのすべての主要なバージョンと互換性があります-ビット)。

this post私はFTPUSEについて書いています(私は作者ではありません。私はこの種の作業に非常に便利です)。

関連する問題