我正在尋找PowerShell解決方案。我們有一臺服務器,其中一些軟件將一些文件夾下載到名爲「接收」的文件夾中。這些內部文件夾可能包含1個或更多文件。我有一個腳本來監視Receive文件夾,並將所有子文件夾(包括他們的數據)從該服務器移動到另一個位置。我已經安排我的腳本每10分鐘做一次。但是我觀察到,在移動數據之後,通常文件夾的某些文件已損壞或某些文件丟失。檢查文件夾以確保使用PowerShell完全下載內容
有什麼方法可以檢查數據是否被複制到遠程文件夾中,並且腳本可以忽略下一次出現的數據?
我正在尋找PowerShell解決方案。我們有一臺服務器,其中一些軟件將一些文件夾下載到名爲「接收」的文件夾中。這些內部文件夾可能包含1個或更多文件。我有一個腳本來監視Receive文件夾,並將所有子文件夾(包括他們的數據)從該服務器移動到另一個位置。我已經安排我的腳本每10分鐘做一次。但是我觀察到,在移動數據之後,通常文件夾的某些文件已損壞或某些文件丟失。檢查文件夾以確保使用PowerShell完全下載內容
有什麼方法可以檢查數據是否被複制到遠程文件夾中,並且腳本可以忽略下一次出現的數據?
假設目錄「Receive」位於「。」
假設接收目錄/文件的時間戳不被保留。
我會檢查寫入目錄的最後一個文件是否早於20分鐘。這個時間直觀地被我作爲10分頻率的一半,以便完全接收一批文件。其實它應該根據你的數據量和頻率來決定。
$recvDirs = (gci .\Receive)
$ageInSec = 1200
$refTime = get-date
foreach ($dir in $recvDirs) {
$dir | add-member childLastWriteTime $dir.LastWriteTime
foreach ($child in (gci $dir.fullname)) {
# since $dir.lastwritetime is always = $child.lastwritetime
foreach ($grandChild in (gci $child.fullname -recurse)) {
if ($grandChild.lastWriteTime -gt $dir.childLastWriteTime) {
$dir.childLastWriteTime = $grandChild.lastWriteTime
}
}
}
write-host $dir ": " $dir.childLastWriteTime
if (($refTime - $dir.childLastWriteTime).TotalSeconds -gt $ageInSec) {
write-host "moving " $dir "..."
# do your move
}
}
一個更安全的方法,如果你能對接收數據的控制,你應該有一個結束傳輸信號/文件或校驗文件/信息來驗證完整性。
我會推薦使用Get-FileHash
來確保副本與原件相符。如果文件丟失,它會給你一個錯誤,並指示文件是否完全下載並且如果它從原始文件和複製文件中生成相同的散列,則是未損壞的。默認的散列算法是SHA256。作爲替代方案,如果您有空,請查看robocopy.exe
。
使用Get-FileHash
樣的想法:
$source = "\\server\path-to-files\"
$destination = "\\server2\destination-of-files\"
$files = Get-Childitem $source -File
$time = (Get-Date -Format "dd-MM-yyyy-HH-mm-ss").ToString()
$loglocation = "C:\logs\"+"$time"+".txt"
$files | foreach {
$copiedfile = "$destination"+"$_"
$originalhash = (get-filehash $_.FullName).Hash
$copyhash = (get-filehash $copiedfile).Hash
if ($originalhash -eq $copyhash){
"'$_','Passed'" >> $loglocation
}
else {
"'$_','Retried'" >> $loglocation
##Put copy command here
}
}
所以,事實上,你將有你在哪裏同步未下載完的文件同步和不完整的文件列出了這些重大問題。如果您使用的是Linux,則可以使用incron
並查找IN_FILE_CLOSE
事件,該事件告訴您文件已關閉以進行寫入,並基於此事件觸發同步,但它可能仍不會幫助您的子文件夾架構方法。
最好的方法是修改將東西轉儲到此文件夾中的軟件。但是,在很多情況下,您可能無法做到這一點。
該下一個最好的方法包括看最後修改時間和只有移動的東西,最近修改前一天,也許一天左右,也許更少。
如果你真的需要把它們發送到遠程服務器,那麼我會建議分離的擔憂這兩個問題:第一,一些後臺程序移動文件夾f起.\Receive\
到.\Archiving\
,表示上傳的完整性,然後又守護進程在交錯時間工作可能會嘗試從.\Archiving\
向遠程服務器發送內容,執行實際的遠程備份。一個好的腳本會嘗試發送它,然後將文件夾移動到.\Verify-Archival\
,其中另一個腳本會檢查「這是否成功上傳,文件長度是否匹配,加密哈希或CRC匹配?「刪除本地副本之前:如果哈希不匹配,而不是刪除,您剛剛轉會.\Archiving\
,並讓其他守護再試
可以之間還單獨從關注移動.\Receive\
文件(。到.\Archiving\
)和刪除文件夾如果您需要快速釋放.\Receive\
中的空間,如果它不存在,在.\Archiving\
下創建新文件夾將非常快,移動文件將是原子性的,一旦文件不存在,可能大概會讓子文件夾保留一天「以防萬一某人沒有完成上傳」。然後刪除所有保留空白一天的子文件夾,並清理它們。
我認爲這些文件沒有被破壞,因爲在複製過程中出現錯誤(您可以像Booga Roo說的那樣計算散列),但是因爲您正在複製的文件並未完全下載到第一位。如果您打開這些文件的原始位置(='接收'文件夾),您會得到類似的錯誤。
可能很難驗證這一點,因爲當您發現它在複製位置已損壞時,可以在原始位置完全下載這些文件。
我會嘗試在複製之前打開每個文件以進行'寫入'。如果該文件仍在下載,那麼文件系統中的文件會有一個寫入鎖定,因此您無法將其打開以進行「寫入」。
如果您可以打開它進行'寫入',請關閉並複製它,如果您不能跳過它並再次嘗試下一次運行。
您可以將所有使用的文件放到數組中,等待10-20秒,然後再將文件放在單獨的列表中。比較文件名稱和大小以查看是否有更改,如果有更改則排除這些文件。 –