如何在PowerShell中从SFTP服务器删除早于x天的文件

3
以下 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个回答

4
如果您可以使用文件的“修改时间”,那么这非常容易实现。只需在文件掩码中使用“时间约束”即可:Winscp文档
$session.RemoveFiles("/test/my_file/*<5D").Check()

如果你需要根据文件名中的时间戳来选择文件,那么这可能会更加困难。不过幸运的是,你的文件名似乎有一个漂亮的固定格式Test_File_yyyymmdd.csv,因此你可以选择那些比Test_File_yyyymmdd.csv早5天的文件,其中yyyymmdd是时间戳。

$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()
    }
< p >< em >(当然,在调用 RemoveFiles 前,请先进行干燥测试)

< p>另请参阅WinSCP关于在PowerShell中格式化相对时间戳的文章


这是我在日志文件中得到的错误信息,< 2018-04-05 13:43:12.236 Script: 找不到与 '*<2D' 匹配的文件。
2018-04-05 13:43:12.392 Script: 退出 . 2018-04-05 13:43:12.392 Script: 退出代码:0 . 2018-04-05 13:43:12.392 关闭连接。 . 2018-04-05 13:43:12.392 发送特殊代码:12 . 2018-04-05 13:43:12.392 发送 EOF 消息。
- rich dave
抱歉,马丁,我已经编辑了我的原始问题并添加了日志文件。希望这有所帮助。 - rich dave
首先,日志中存在一些不一致。你编辑过它吗?开头写着* <2D,而结尾却是* <5D。- 无论如何,所有文件的时间戳都是2018-04-05,因此确实没有比5天甚至2天更旧的文件。- 我可以看到文件名中也有时间戳。所以也许你实际上想匹配文件名,而不是(最后修改)时间戳。但这是完全不同的问题。 - Martin Prikryl

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()
    }

我该如何使用你的代码并将其与我的代码链接起来,因为我需要连接到SFTP并从那里删除文件? - rich dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接