2016-07-14 72 views
0

我使用PowerShell的一些文件操作,並執行以下步驟:(Powershell的測試路徑然後刪除項目,但文件由另一個進程使用

  1. 複製從一個位置的文件到另一個禁止複製項)
  2. 驗證新的文件是它的預期(測試路徑)
  3. 如果在新位置驗證,刪除原始(刪除項)

這個過程工程的99.9%時間但是someti mes當刪除項目步驟發生時,我收到錯誤通知我原始文件已被使用/鎖定。我只能假定使用這個過程是步驟1或步驟2中的複製項目/測試路徑。

是否需要指示Powershell等待複製項目/測試路徑完成後再繼續刪除項目?或者更有可能有另一個進程在其他地方運行,例如訪問AV導致此問題?如果是這樣,是否有一種方法可以在發生文件鎖定的情況下輕鬆地重試?

這裏是執行中提到的步驟的代碼的一部分:

if ($copySuccess = "TRUE") { 
    $wiFiles = Get-ChildItem $xmlDir -Filter $itemNum*.* 
    $wiFiles | ForEach-Object { 
     if ($copySuccess -eq "TRUE") { 
      Copy-Item -LiteralPath $xmlDir\$_ -Destination $processedDir 
       if (!(Test-Path -LiteralPath $processedDir\$_)) { 
        $copySuccess = "FALSE" 
       } 
      } 
     } 
    }      
    if ($copySuccess -eq "TRUE") { 
     Get-ChildItem $xmlDir -Filter $itemNum*.* | Remove-Item 
    } 

被移動的文件是小的文本文件或圖像文件< 1MB並且通常< 10每itemNum文件。

謝謝,羅布。

+0

腳本本身在哪裏?我們需要至少看一個[mcve]以驗證爲什麼可能會鎖定文件。 – gravity

+1

'Copy-Item'是同步的,所以它不可能是罪魁禍首。掃描文件系統的AV或其他軟件(如果它位於谷歌驅動器/保管箱/ skydrive文件夾中,可能是索引器,同步軟件)更有可能。要確定你必須做什麼,你必須弄清楚什麼是鎖定它。 – briantist

回答

0

您的cmdlet導致問題的可能性很小。如果你想確保下一個開始之前每個cmdlet結束在

$job1 = Start-Job { [Powershell code] } 
Wait-Job $job1 

包裝每個命令對於刪除命令,你可以嘗試沿着

While (Test-Path($yourFileDir)){ 
    Try{ 
     remove-item [your item] -ErrorAction Stop 
    }catch{ 
     Write-Verbose "File locked, trying again in 5" 
     Start-Sleep -seconds 5 
    } 
} 

當然線的東西,你可以整理這以適應您的需求,增加適當的超時時間等。

+0

閃存,該代碼看起來應該適合帳單很好,謝謝!將嘗試和更新。乾杯,羅布。 –

+0

@RobBerry,它是怎麼回事?作爲工作來解決問題還是需要執行任務?還是您需要兩者?我可能很快就會做類似的事情,並希望知道你是怎麼做到的。 –

+0

嗨Flash,我之前做過一個快速測試,但遇到了問題,因爲在刪除項目出錯後沒有觸發catch。需要明天做一些測試,但會讓你知道。 RGDS,羅布。 –

相關問題