2017-05-22 7 views
1

毎晩実行するPowerShellスクリプトを作成して、C:\ share1からC:\ share2にPDFファイルをコピーし、イベントログに書き込みます。ファイルをコピーし、使用中のファイルをスキップします。

私の現在のファイルコピースクリプトのビットは次のようになります。私はここに実行

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 
} 

問題は、ファイルを置き換える/コピー使用されてbeeingていることです。私はそれが残りのファイルをコピーし続けて、少なくとも私のスクリプトを修正したいと思います

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

:ファイルが使用中の場合 スクリプトがエラーで前記ファイルにコピーを停止します。

たとえば、100個のファイルがあり、3番目のファイルが使用されていた場合は、転送がすべて停止します。

残りのアイテムを処理するスクリプトを変更するにはどうすればよいですか?

+0

この問題が発生したときに返される_entire_エラーは何ですか?特定のエラータイプを「キャッチ」できます。 – gvee

+0

ファイルのコピーを開始し、別のマシンが使用しているファイルで停止し、前述の「PS terminatingError」をトランスクリプト出力ファイルの内容として「Transcript stopped」に移動します。 – Vhoyland

答えて

1

あなたはSilentlyContinueにセットされた共通-ErrorAction PARAMTERを探しています:

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

注:あなたははここForeach-Objectレット必要はありません。

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

注2 : gveeが述べたように、これはすべてのエラーを無視します。別のオプションは、sysinternalsスイートのhandle.exeを使用して、オープンハンドルがあるかどうかをチェックすることです。

+0

これは動作しますが、使用中のファイルだけでなく**すべての**エラーは無視されます – gvee

+0

こんにちは!ご返事ありがとうございます! ForEach-Objectを使用しない場合は、冗長な出力(コンソールでは最低)が得られません。 ただし、ErrorActionがSilently continueに設定されていても停止します。 同じ終了エラー...その他のヒント? – Vhoyland

関連する問題