如何每天复制文件一次 - 优雅的解决方案

时间:2012-10-08 14:36:02

标签: powershell powershell-v2.0 powershell-v3.0

我有远程服务器,每天上传一个文件。我不知道什么时候会上传文件。我需要将此文件复制到另一台服务器进行处理,我需要每个文件只执行一次(每天一次)。当文件上传到远程服务器上时,我需要在一小时内复制它,所以我必须每小时至少运行一次这个脚本。我正在使用这个脚本:

# Get yesterday date
$date = (Get-Date).Adddays(-1) | Get-Date -Format yyyyMMdd
$check = ""
$check = Get-Content c:\checkiftransfered.txt

# Test if file checkiftransfered.txt contains True or False. If it contains True, file for this day was already copyied
if ($check -ne "True") {
    #Test if file exists - it has specific name and yesterday date
    if(Test-Path \\remoteserver\folder\abc_$date.xls) {

        Copy-Item \\remoteserver\folder\abc_$date.xls \\remoteserver2\folder\abc_$date.xls
        # Write down information that file was already copyied
        $check = "True" | Out-File c:\checkiftransfered.txt

    } else { Write-Host "File has not been uploaded."}
} else { Write-Host "File has been copyied."}
# + I will need another script that will delete the checkiftransfered.txt at 0:00

我认为它会正常工作,但我正在寻找更优雅的解决方案 - 如何解决它的最佳方法。谢谢

2 个答案:

答案 0 :(得分:4)

在PowerShell V3中,Test-Path有一个方便的-NewerThan-OlderThan参数,因此您可以简化为:

$yesterday = (Get-Date).AddDays(-1)
$date = $yesterday | Get-Date -Format yyyyMMdd
$path = "\\remoteserver\folder\abc_$date.xls"
if (Test-Path $path -NewerThan $yesterday) 
{
    Copy-Item $path \\remoteserver2\folder\abc_$date.xls -Verbose
    (Get-Item $path).LastWriteTime = $yesterday
}

这消除了使用LastWriteTime单独跟踪复制状态的需要。关于使用-NewerThan-OlderThan的一个注意事项 - 不要一起使用它们。它没有按预期工作。

为了避免我们忘记一些出色的原生工具,这里有一个使用robocopy的解决方案:

robocopy $srcdir $destdir /maxage:1 /mot:60

/mot:n选项将导致robocopy持续监控源目录 - 每60分钟一次,如上所述。

答案 1 :(得分:2)

有一种更容易,更可靠的方式。您可以使用FileSystemWatcher类。

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = 'C:\Uploads'
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$created = Register-ObjectEvent $watcher "Created" -Action {
  Sleep (30*60)
  Copy-Item $($eventArgs.FullPath) '\\remoteserver2\folder\'
}

所以让我们来看看我们在这里做什么,我们创建一个新的观察者并告诉它观看C:\ Uploads当一个新文件上传到那里时,文件系统通过框架向我们的程序发送通知,其中转动触发创建的事件。当发生这种情况时,我们告诉我们的程序睡眠30分钟以允许上传完成(可能会长到取决于上传的大小)然后我们在包含完整的事件参数上调用Copy-Item我们新文件的路径。

顺便说一下,您需要将其粘贴到PowerShell窗口中并将其保留在服务器上,或者您可以使用ISE并保持打开状态。无论哪种方式,它都比你现在拥有的更可靠。