2010-06-22 44 views
12

我有一個PS腳本每5分鐘啓動一次,以檢查新丟棄的文件夾並移動它們。問題是,有時文件夾內的項目仍在寫入,在這種情況下腳本錯誤與:Powershell:IOException嘗試/ catch不起作用

Move-Item:進程無法訪問文件,因爲它正在被另一個進程使用。 [布展項目],IOException異常+ FullyQualifiedErrorId:MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

我已經試過以下try/catch塊,但在相同的「移動項目」線仍然錯誤。我在這裏做錯了什麼想法?

  try { 
      Move-Item -Force "$fileString" $fileStringFixed 
      } 
      catch [System.IO.IOException] { 
      return 
      } 

謝謝。

回答

23

Try/catch語句只能捕捉終止錯誤(通常表示嚴重錯誤)。 PowerShell還具有非終止錯誤的概念。您看到的文件使用中的錯誤是一個非終止錯誤。從一個角度來看,這是很好的,如果你要移動成千上萬的文件,並且有一個文件的目標正在使用,那麼這個命令不會讓它繼續下去。你有兩個選擇。您可以通過設置ErrorAction參數爲SilentlyContinue(值爲0),如忽略這些錯誤:

Move-Item foo bar -ea 0 

或者您也可以通過此相同的參數設置爲「停止」非終止錯誤轉化爲終止錯誤,然後使用的try/catch雖然不被IOException異常篩選因爲PowerShell的包裝異常如:

try { move-Item .\About_This_Site.txt vmmap.exe -ea stop } ` 
catch {$_.GetType().FullName} 
System.Management.Automation.ErrorRecord 
+0

看起來就像它那樣,非常感謝你! – orbitron 2010-06-22 23:48:00

+5

或全局設置爲停止:$ ErrorActionPreference ='停止' – 2010-09-06 06:53:07

0

我最常做的這些情況是使用switch語句,它適用於大多數沒有終止錯誤。像這樣的東西;

Switch -Regex ($_.exception) { 
     "used by another process" { 
      "Do Something about the error" 
     } 
    Default { 
      "Default Action" 
     } 
} 

它只是查看異常並執行腳本塊中定義的內容。

更可以在switch語句herehere

1

我能夠加入-ErrorAction StopMove-Item命令來解決這個問題被發現。這似乎迫使它按預期拋出一個錯誤,而不是做任何想要的事情。