2010-06-22 9 views
12

Ho uno script PS che si avvia ogni 5 minuti per verificare la presenza di cartelle appena scaricate e spostarle. Il problema è che a volte gli elementi all'interno della cartella vengono ancora scritti, nel qual caso gli errori di script con:Powershell: IOException try/catch non funziona

Move-Item: il processo non può accedere al file perché è utilizzato da un altro processo. [Move-Item], IOException + FullyQualifiedErrorId: MoveDirectoryItemIOError, Microsoft.PowerShell.Commands.MoveItemCommand

ho provato il seguente blocco try/catch ma ancora errori sulla stessa linea "Move-Item". Qualche idea su cosa sto facendo di sbagliato qui?

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

Grazie.

risposta

23

Le istruzioni di prova/cattura possono solo rilevare errori di terminazione (di solito indicano un errore grave). PowerShell ha anche il concetto di errori non terminanti. L'errore del file in uso che vedi è un errore non terminante. Questo è positivo dal punto di vista del fatto che se si spostavano migliaia di file e uno aveva il suo obiettivo in uso, il comando non lo schifo continua. Hai due scelte qui. È possibile ignorare questi errori impostando il parametro ErrorAction SilentlyContinue (valore 0) ad esempio:

Move-Item foo bar -ea 0 

Oppure si può convertire il non fatale errore per un errore fatale impostando questo stesso parametro di 'Stop' e poi utilizzare il try/catch, anche se non filtrare per IOException perché PowerShell avvolge l'eccezione ad esempio:

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

Sembra che l'abbia fatto, grazie mille! – orbitron

+5

Oppure imposta globalmente l'arresto: $ ErrorActionPreference = 'Stop' –

0

Cosa faccio di solito con queste situazioni è utilizzare un'istruzione switch, funziona per la maggior parte degli errori di terminazione nessuno. Qualcosa come questo;

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

Sta solo osservando l'eccezione e facendo qualcosa definito nel blocco di script.

Maggiori informazioni possono essere trovate sul istruzioni switch here o here

1

sono stato in grado di risolvere questo con l'aggiunta di -ErrorAction Stop al comando Move-Item. Questo sembra costringerlo a lanciare un errore come previsto, invece di fare quello che vuole.

Problemi correlati