如何从PowerShell中的SFTP服务器删除x天以前的文件

时间:2018-04-04 16:28:29

标签: powershell sftp winscp winscp-net

以下PowerShell脚本连接到我的SFTP服务器并删除路径/test/my_file/.下的所有文件

有没有办法可以说只删除路径/test/my_file/下五天的文件。

Add-Type -Path " WinSCPnet.dll"

$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "example.test.com"
    UserName = "username"
    Password = "password"
    SshHostKeyFingerprint = "ssh-rsa 1234 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
}

$sessionOptions.AddRawSettings("ProxyMethod", "0")
$sessionOptions.AddRawSettings("ProxyHost", "123.45.67.8")
$sessionOptions.AddRawSettings("ProxyPort", "8080")

$session = New-Object WinSCP.Session

try
{
    $session.Open($sessionOptions)

    # Remove files
    $session.RemoveFiles("/test/my_file/*").Check()
}
finally
{
    $session.Dispose()
} 

文件的名称如下:

Test_File_20180315.csv
Test_File_20180316.csv
Test_File_20180319.csv
Test_File_20180320.csv
Test_File_20180321.csv
Test_File_20180322.csv
Test_File_20180323.csv
Test_File_20180326.csv
Test_File_20180327.csv
Test_File_20180328.csv
Test_File_20180329.csv
Test_File_20180330.csv
Test_File_20180402.csv
Test_File_20180403.csv
Test_File_20180404.csv

提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果您可以使用文件的修改时间,那就很简单了。只需使用time constraint in the file mask

$session.RemoveFiles("/test/my_file/*<5D").Check()

但是,如果您需要通过名称中的时间戳选择文件,则会更加困难。幸运的是,您的文件名似乎有一个很好的固定格式Test_File_yyyymmdd.csv,因此您可以在Test_File_yyyymmdd.csv之前选择那些排序,其中yyyymmdd为5天:

$limit = [System.DateTime]::Today.AddDays(-5).ToString("yyyyMMdd")

$session.ListDirectory("/test/my_file").Files |
    Where-Object { !$_.IsDirectory } |
    Where-Object { $_.Name -lt ("Test_File_" + $limit) } |
    ForEach-Object { 
        Write-Host ("Deleting {0} ..." -f $_.Name)
        $session.RemoveFiles($_.FullName).Check()
    }

(当然,先删除RemoveFiles来电进行干测试

另见formatting relative timestamps in PowerShell上的WinSCP文章。

答案 1 :(得分:0)

在我使用的一个脚本中,我有多个操作要执行,但最后我会删除超过几天的文件。所以,我在开始时获取所有文件一次,然后在最后删除它们。

最小代码如下:

Add-Type -Path 'C:\Path\To\WinSCP\WinSCPnet.dll'

# Midnight 5 days ago
$DeletionDate = [System.DateTime]::Today.AddDays(-5)

$SessionOptions = New-Object WinSCP.SessionOptions -Property @{ ... }

$Session = New-Object WinSCP.Session
$Session.Open($SessionOptions)

$RemoteFiles = $Session.ListDirectory($RemotePath).Files | Where-Object { !$_.IsDirectory }

# My other processes are here

$RemoteFiles | 
    Where-Object LastWriteTime -lt $DeletionDate |
    ForEach-Object {
        $RemoveFilesResult = $Session.RemoveFiles($_.FullName)
        $RemoveFilesResult.Check()
    }