2012-10-08 51 views
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 

它會正常工作,我想,但我在尋找更好的解決方案 - 如何解決這個問題的最好辦法。謝謝

+0

您可以編寫腳本,並在您希望的任何時間將其作爲「cron」作業運行。 – karthikr

+0

我知道我可以安排它,但這不是問題。我需要確認這個解決方案是如何解決它的最好方法。 – culter

回答

3

在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

對$ Path使用雙引號。 –

+0

贊同謝謝您使用$日期在$路徑中使用雙引號,以使其得到評估 – 2012-10-08 16:26:39

+0

是的,良好的捕獲。更新以修復它。我複製/粘貼了該路徑,而沒有仔細查看它。使用上述方法不確定日期需要在路徑中。 –

1

有一個更容易,更可靠的方法。您可以使用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:\上傳當一個新文件被上傳有文件系統發送通知通過框架給我們程序,該程序反過來激發創建的事件。當發生這種情況時,我們告訴我們的程序要休眠30分鐘以完成上傳(根據上傳的大小可能會延長),然後我們在事件參數上調用Copy-Item,其中包含完整路徑文件。

順便說一下,你需要將它粘貼到PowerShell窗口中並在服務器上保持打開狀態,或者可以使用ISE並將其保持打開狀態。無論哪種方式,它是目前你所擁有的方式更可靠。

+0

+1您可以附加一個無限循環並將​​其作爲後臺進程運行。不過,該腳本塊可能需要一些錯誤處理和日誌記錄。 –

+0

如果你要走這條路線,那就把它作爲一項服務寫下來。您不必讓用戶以不斷運行的PowerShell窗口交互式登錄。 – alroc

相關問題