以下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
提前谢谢。
答案 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()
}