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

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

4

2 回答 2

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 分钟一次,如上所述。

于 2012-10-08T16:14:50.320 回答
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 并保持打开状态。无论哪种方式,它都比您目前拥有的更可靠。

于 2012-10-08T16:24:18.757 回答