快速需求:在一个SQL Agent作业步骤中,我正在寻找一种将“超过60分钟”新文件复制到另一台服务器的方法。我不想重新复制任何早于此的文件。因此,因为这是Windows 2008或更高版本的服务器,所以复制,xcopy,robocopy都是可能的。
背景:我正在整理一个过程,其中serverA有一个文件夹,其中ERP应用程序将平面文本文件转储到该文件夹。我需要每小时一次将“最新文件”复制到serverB,以便另一个应用程序(每60分钟启动一个SSIS程序包)可以处理该文件并将数据保存到SQL Server中。为了只复制出现的“新文件”而不复制我已经复制过的任何内容(如果存在将不起作用,因为我将在SSIS处理后删除复制的文件),我基本上需要复制的文件只有60分钟或更长时间,并排除所有其他文件。
出于其价值所在,所使用的方法将是SQL Agent Job步骤,因此都允许使用CmdExec和Powershell(我是PowerShell的新手,因此倾向于Robocopy)。
答案 0 :(得分:0)
我的解决方案(也是我的第一个PowerShell脚本)是使用PowerShell的“ Where-Object” cmdlet将仅60分钟或更晚的文件通过管道传输到“ Get-ChildItem”,然后在foreach中使用“ Copy-Item”如下:
$srcPath = '\\serverA\ERP\Outbox\'
$destPath = 'C:\ERP\FromERP\Inbox\'
# target files where LastWriteTime >= 60 minutes "ago"
$age = (Get-Date).AddMinutes(-60)
#Write-Output "$age"
$newFiles = Get-ChildItem $srcPath | Where-Object { $_.LastWriteTime -ge $age }
#Write-Output "$newFiles"
foreach ($newFile in $newFiles) {
#Write-Output "Copying $newFile to $destPath"
Copy-Item $newFile.FullName -Destination "$($destPath)$($newFile)"
}
其中一些被注释的行仅仅是出于调试目的,但是我留给他们是为了帮助理解发生的事情。
注意:我尝试了copy,xcopy和robocopy,并且我认为我可以在别处看到一些巧妙的批处理语言语法,因此可以使它们工作(robocopy具有MAXAGE参数,但最小值为1天,即在几分钟内还不够细致),但PowerShell确实让您感觉更简单,更优雅。
希望其他人可以使用该技术。