Windows批处理脚本,根据创建的扩展名和时间重命名和删除文件

时间:2011-12-13 21:12:11

标签: windows powershell batch-file

我们有一个程序可以获取特定的XML文件并导入它们,然后将文件从.xml更改为.tmp。一旦转到.tmp,我们就可以删除该文件。

偶尔会发生什么情况,XML文件无法正确导入,在这种情况下,它会从.xml重命名为.bad,并且必须手动调整文件(可能是不正确的xml文件或其他)。我们发现大约90%的时间,如果你将文件重命名为.xml,它导入的很好。

我创建了一个批处理脚本,每隔几分钟运行一次,自动删除.tmp文件。我还想做的是在脚本中添加一些东西,将.bad文件重命名为.xml,以便程序尝试再次导入它。这将覆盖90%。

为了覆盖最后10%,我想设置它以便在大约10分钟后,它不再尝试将文件.bad重命名为.xml(基于创建日期)。< / p>

到目前为止,我所拥有的是删除.tmp文件的脚本:

forfiles -p "C:\path\to\xml" -m *.tmp -c "cmd /c del @PATH"

我有脚本将.bad重命名为.xml:

forfiles -p "C:\path\to\xml" -m *.bad -c "cmd /c ren *.bad *.xml"

如何告诉第二个命令仅对创建日期(不是最后修改日期)少于10分钟的文件执行此操作?

已更新:

这是完整的解决方案(感谢jon Z指出我正确的方向):

powershell.exe -command "get-childitem 'path\to\xml' -filter *.tmp | Remove-Item"

powershell.exe -command "get-childitem 'path\to\xml' -filter *.bad | where-object {$_.creationtime -gt (get-date).addminutes(-8)} | foreach-object {move-item $_.fullname ($_.fullname-replace '.bad','.xml')}"

2 个答案:

答案 0 :(得分:3)

如果选择使用powershell而不是cmd,则可以执行以下操作:

删除文件:

get-childitem c:\path\to\xml -filter *.tmp | remove-item

将.bad重命名为.xml

get-childitem c:\path\to\xml -filter *.bad |  where-object {$_.creationtime -gt (get-date).addminutes(-10)} | foreach-object {move-item $_.fullname ($_.fullname -replace '.bad','.xml')}

答案 1 :(得分:1)

假设当文件失败两次时它永远不会成功,那么你可以创建一个跟踪文件(让我们称之为.trk),而不是仅仅将.bad文件重命名为.xml。下次在跟踪剩余的.bad文件之前,删除所有旧的.trk文件和仍然存在的任何匹配的.bad文件(因为这意味着文件失败了两次)。