2016-07-27 128 views
3

X天的刪除文件我必須寫它訪問FTP服務器,然後刪除所有*.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

你必須獲取遠程文件的時間戳來選擇舊的。

不幸的是,使用.NET Framework/PowerShell提供的功能檢索時間戳沒有真正可靠和有效的方法,因爲它不支持FTP MLSD命令。

因此,無論你使用:

  • ListDirectoryDetails方法(FTP LIST命令)來檢索目錄中的所有文件的詳細信息,然後你處理的細節FTP服務器的特定格式(類似於ls * nix的格式* nix的命令是最常見的,缺點是格式可隨時間變化,對於較新的文件「5月8日17點48分」的格式被用於和較舊的文件「二○○九年十月一十八日」格式時)
  • 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),批處理和FTP批處理。 – PJS

+0

我在「ListDirectoryDe​​tails」中遇到的一個問題是,我無法找到與「-recurse」參數類似的文件夾和文件夾層次結構中較低的文件。 – PJS

+0

請注意,WinSCP不需要任何安裝。所以你可以用你的批處理文件或者PowerShell腳本來拷貝它的二進制文件。 –

0

目前,我正在做這個使用FTPUSE,一個免費的命令行工具,一個FTP文件夾映射到Windows盤符,連同一個批處理文件以下列方式:

: 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的所有主要版本兼容:Windows XP中,Vista中,7,Server 2003中,服務器2008,Windows 8中,服務器2012和Windows 10(32位,64位)。

欲瞭解更多信息,您還可以閱讀this post我寫了關於FTPUSE(我不是作者,我只是覺得它對這類任務非常有用)。

相關問題