如何从PowerShell中的SFTP服务器删除比X天大的文件



以下powershell脚本连接到我的sftp sever并在路径 /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

预先感谢您。

如果您可以使用文件的修改时间,这很容易。只需在文件掩码中使用时间约束:

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

但是,如果您需要以 TIMESTAMP的名称选择文件,则更加困难。幸运的是,您的文件名似乎具有不错的固定格式Test_File_yyyymmdd.csv,因此您可以在yyyymmdd之前选择 sort sort ,其中 CC_5年龄为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调用(

另请参见WINSCP文章有关PowerShell中格式化相对时间戳的文章。

在我使用的一个脚本中,我有多个操作可以执行,但是最后我删除了比几天更年长的文件。因此,我在开始时一次获取所有文件,然后将其删除。

最小代码看起来像:

Add-Type -Path 'C:PathToWinSCPWinSCPnet.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()
    }

最新更新