我有远程服务器,每天上传一个文件。我不知道什么时候会上传文件。我需要将此文件复制到另一台服务器进行处理,我需要每个文件只执行一次(每天一次)。当文件上传到远程服务器上时,我需要在一小时内复制它,所以我必须每小时至少运行一次这个脚本。我正在使用这个脚本:
# 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
我认为它会正常工作,但我正在寻找更优雅的解决方案 - 如何解决它的最佳方法。谢谢
答案 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并保持打开状态。无论哪种方式,它都比你现在拥有的更可靠。