2016-07-27 83 views
2

我正在從硬盤中恢復文件,其中一些文件不可讀。我無法更改硬件級別的超時/ ERC,當我有幾十萬個文件時,解決這個問題非常困難,其中成千上萬個文件可能無法讀取。超時複製項目

數據問題是控制器故障的結果。購買一個匹配的驅動器(一路下來),我已經能夠訪問驅動器,並且可以複製大量的驅動器而沒有問題。但是,整個驅動器中存在無法讀取的文件,訪問時會導致SATA總線掛起。我使用了各種可恢復的文件複製應用程序,如robocopy,RichCopy和其他十幾個應用程序,但它們都有相同的問題。它們有一個RETRY計數,它基於實際獲取驅動器報告的錯誤。問題是驅動器花費很長時間來報告錯誤,這意味着單個文件可能需要長達一個小時才能正式失敗。我知道每個文件應該有多快,所以我想要構建一個powershell CMDLET或類似的文件,以允許我傳入源文件名和目標文件名,並讓它嘗試複製文件。如果在5秒後文件沒有被複制(或者它有 - 這可能是一個愚蠢的過程),我希望它退出。我將編寫一個腳本,它可以逐個觸發每個複製過程,在完成過程之前等待過程,但是我至今無法找到一個對過程進行時間限制的好方法。

你可能會有任何建議,將不勝感激!

編輯:我會很高興在新線程中產生一個Copy-Item,帶有一個新的PID,然後倒計時,然後殺死該PID。我只是PowerShell的新手,並且看到了很多衝突的方法來強加定時器,以至於我失去了最佳實踐方式。

編輯2:請注意,像robocopy這樣的應用程序將在遇到磁盤的不良區域時完全掛起。這些不是簡單的掛起,而是窗戶爲了不丟失數據而試圖保存的公共汽車。在這些情況下,任務管理器無法終止進程,但是Process Explorer IS。我不確定方法學有什麼不同,但無論如何,這似乎都是相關的。

+0

[ROBOCOPY](https://technet.microsoft.com/en-us/library /cc733145(v=ws.11).aspx)/ w:10/r:1 – lloyd

+0

@lloyd這將在超時+ 10秒後重試一次。 –

+0

Lloyd,在這種情況下,Robocopy沒有收到驅動器發送的操作失敗的消息,因此重試計數無關緊要。該驅動器會坐下來愉快地假裝它仍然提取許多小時(每個文件)的數據,所以它永遠不會合理地進入重試計數器。 –

回答

6

我想說在PowerShell中這樣做的規範方式是background jobs

$timeout = 300 # seconds 

$job = Start-Job -ScriptBlock { Copy-Item ... } 
Wait-Job -Job $job -Timeout $timeout 
Stop-Job -Job $job 
Receive-Job -Job $job 
Remove-Job -Job $job 

用你希望運行的任何命令替換Copy-Item。但要小心,要在腳本塊中使用的所有變量必須在腳本塊中定義,通過參數-ArgumentList傳入,或者以using:範圍限定符作爲前綴。

Wait-Job另一種方法是一個循環,等待,直到該作業完成或達到超時:

$timeout = (Get-Date).AddMinutes(5) 
do { 
    Start-Sleep -Milliseconds 100 
} while ($job.State -eq 'Running' -and (Get-Date) -lt $timeout) 
+0

非常感謝您的指針!正如我懷疑MIGHT可能是SATA掛起時遇到的問題一樣,該過程並未終止,只能通過斷開驅動器來釋放。我使用已知工作驅動器的副本對其進行了測試,結果與預期完全一致。如果進程未被終止,我的下一步將是在文件之間發送powerdown命令給微控制器。這段代碼確實適當地處理了時間,我非常感謝!謝謝!編輯:並感謝您的編輯幫助! –