2017-05-22 4 views
1

Je tente d'exécuter un script PowerShell tous les soirs, de copier des fichiers PDF de C: \ share1 vers C: \ share2 et d'écrire dans le journal des événements.Copier des fichiers et ignorer ceux en cours

Mon bit courant de script de copie de fichier ressemble à ceci:

Try 
{ 
    get-childitem -Path C:\Share1 | ForEach-Object { Copy-Item $_.FullName C:\share2 -verbose } 
    #Writes to event log as success. 

} 
Catch 
    #Logs the event as failed 
} 

La question que je lance ici dans est que les fichiers copiés beeing/remplacés sont en cours d'utilisation. Lorsqu'un fichier est utilisé le script cesse de copier ce fichier dit avec une erreur:

PS>TerminatingError(Copy-Item): "The process cannot access the file 'C:/share2/1.pdf' because it is being used by another process." 

Je voudrais au moins modifier mon script pour qu'il continue de copier les fichiers restants.

Si j'avais par exemple 100 fichiers et que le 3ème était utilisé, tout le transfert s'arrête.

Comment puis-je modifier mon script pour continuer sur les éléments restants?

+0

Quelle est l'erreur _entire_ que vous recevez lorsque ce problème se produit? Vous pouvez «attraper» les types d'erreurs spécifiques. – gvee

+0

Il commence à copier les fichiers et s'arrête sur celui qui est utilisé par une autre machine, puis passe à "Transcript arrêté" avec le "PS terminatingError" mentionné ci-dessus comme le contenu du fichier de sortie de transcription. – Vhoyland

Répondre

1

Vous cherchez la -ErrorAction commune avec paramter ensemble à SilentlyContinue:

get-childitem -Path C:\Share1 | ForEach-Object { Copy-Item $_.FullName C:\share2 -verbose -ErrorAction SilentlyContinue } 

Note: Vousne besoin l'applet de commande Foreach-Object ici:

Get-ChildItem -Path C:\Share1 | Copy-Item C:\share2 -verbose -ErrorAction SilentlyContinue 

Note 2 : Comme mentionné ci-dessus, cela va ignorer toutes les erreurs. Une autre option consisterait à utiliser handle.exe de la suite sysinternals pour vérifier s'il existe un handle ouvert.

+0

Alors que cela va fonctionner - il va ignorer ** toutes ** les erreurs, pas seulement les fichiers en cours d'utilisation – gvee

+0

Salut! Merci beaucoup pour votre réponse! Si je n'utilise pas l'objet ForEach, je ne recevrai pas la sortie verbeuse (au moins dans la console). Cependant, il s'arrête toujours même si ErrorAction est défini sur Silencieux en continu. Même erreur de fin ... D'autres conseils? – Vhoyland