Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 删除名称中的时间戳早于2天的远程.csv文件_Batch File_Ftp_Winscp - Fatal编程技术网

Batch file 删除名称中的时间戳早于2天的远程.csv文件

Batch file 删除名称中的时间戳早于2天的远程.csv文件,batch-file,ftp,winscp,Batch File,Ftp,Winscp,我正在尝试删除FTP服务器中早于2天的远程(.csv)文件 文件的上次修改时间设置不正确。我必须依靠他们名字上的时间戳 文件的命名类似于Sales\u 201705010315.csv(日期和时间) 我当前的WinSCP脚本是: option batch on option confirm off open login ftp credentials cd /OUT rm *<1D exit 选项批处理打开 选项确认关闭 打开登录ftp凭据 cd/OUT rm*请注意,FTP服务器上的文

我正在尝试删除FTP服务器中早于2天的远程(.csv)文件

文件的上次修改时间设置不正确。我必须依靠他们名字上的时间戳

文件的命名类似于
Sales\u 201705010315.csv
(日期和时间)

我当前的WinSCP脚本是:

option batch on
option confirm off
open login ftp credentials
cd /OUT
rm *<1D
exit
选项批处理打开
选项确认关闭
打开登录ftp凭据
cd/OUT

rm*请注意,FTP服务器上的文件将具有在FTP服务器上创建文件的日期/时间,而不是原始文件的日期/时间。因此,如果您的文件是通过夜间运行的自动任务传输的,FTP服务器的日期/时间可能会有所不同。如果FTP服务器上的日期/时间未与时间服务器同步,则会遇到相同的问题。如果FTP发送机器和接收机器位于不同的时区,您可能会遇到问题。

这确实会删除“超过1天”(而不是2天)的文件:

这使用了。语法将使命令解析为(自2017-05-04起):

但这不会删除3天及以上的文件。如果您每天定期运行脚本,这不是问题。如果你想应付一天或几天的停机,你可以删除带有时间戳2、3、4的文件。。。几天以前,比如:

rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv
rm Sales_%TIMESTAMP-3D#yyyymmdd%????.csv
rm Sales_%TIMESTAMP-4D#yyyymmdd%????.csv
...

如果您真的想删除时间戳为2天或更长时间的所有文件,则必须使用更强大的语言编写脚本

例如:

#加载WinSCP.NET程序集
添加类型-路径“WinSCPnet.dll”
#设置会话选项
$sessionOptions=新对象WinSCP.sessionOptions
#设置会话选项
$sessionOptions=新对象WinSCP.sessionOptions-属性@{
协议=[WinSCP.Protocol]::Ftp
HostName=“ftp.examle.com”
UserName=“UserName”
Password=“Password”
}
#连接
写主机“连接…”
$session=新对象WinSCP.session
$session.Open($sessionOptions)
写主机“列出文件…”
$remotePath=“/OUT”
$files=$session.ListDirectory($remotePath).files
$prefix=“销售”
$twoDaysBack=(获取日期).AddDays(-2)
$timestamp=$twoDaysBack.ToString(“yyyyymmdd”)
foreach($files中的文件)
{
如果($file.Name.Length-gt($prefix.Length+$timestamp.Length))-和
($file.Name.SubString(0,$prefix.Length)-eq$prefix)-和
($file.Name.SubString($prefix.Length,$timestamp.Length)-le$timestamp))
{
$path=[WinSCP.RemotePath]::escapeFileTask($file.FullName)
$session.RemoveFiles($path).Check()
写入主机“已删除$($file.Name)”
} 
}
写主机“完成”

如何运行.txt文件?这看起来像WinSCP脚本,但您没有提到WinSCP+问题是什么?剧本看起来不错。如果它不能按您希望的方式工作,您必须告诉我们,出了什么问题!+不过为什么要使用
*您好,我正在使用sales.bat文件运行.txt文件。txt脚本运行正常,rm部分除外。起初我给了rm*.csv,然后所有的文件都被删除了。我的问题是我需要删除2天以前的文件。您能否帮助我如何根据我的文件名(sales_201705010315)删除这些文件,以便无法根据文件修改时间选择这些文件?我可以选择它们,但我每天都运行批处理文件,我理解。我的意思是“按文件时间戳自动选择”。好的,我假设这是不可能的。“请注意,FTP服务器上的文件将具有文件在FTP服务器上创建的日期/时间,而不是原始文件的日期/时间”-您如何知道?这取决于上传者,明白了。我尝试以rm%%timestamp-1d#yyymmddhhss%%的身份运行。但这也没有删除这些文件。你能帮我修改脚本以匹配“how do you know?”吗?根据他的删除代码判断,我假设他正在使用类似的东西上传文件,这将是一个FTP put。他没有提到任何其他软件,但这是一个正确的观点。你能在上传文件的客户端保留一个日志,然后运行该日志,从文件名中提取日期/时间,并根据文件名而不是FTP服务器上的日期计算进行删除吗?@thx1138v2脚本使用WinSCP,谁的
put
会更新上传的时间戳以匹配源文件-尽管下载脚本没有说明上传文件的方式,所以我们对此一无所知。
rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv
rm Sales_20170502????.csv
rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv
rm Sales_%TIMESTAMP-3D#yyyymmdd%????.csv
rm Sales_%TIMESTAMP-4D#yyyymmdd%????.csv
...