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