Скопируйте файлы и пропустите используемые

Я пытаюсь сделать сценарий PowerShell для запуска каждую ночь, чтобы скопировать PDF-файлы из C:\share1 в C:\share2 и записать в журнал событий.

Мой текущий скрипт копирования файлов выглядит следующим образом:

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
}

Проблема, с которой я сталкиваюсь, заключается в том, что файлы, которые копируются / заменяются, используются. Когда файл используется, скрипт перестает копировать этот файл с ошибкой:

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

Я хотел бы по крайней мере изменить свой сценарий, чтобы он продолжал копировать оставшиеся файлы.

Если у меня, например, было 100 файлов, а третий использовался, вся передача останавливается.

Как я могу изменить свой сценарий, чтобы продолжить работу над оставшимися элементами?

1 ответ

Вы ищете общее -ErrorAction параметр с установленным на SilentlyContinue:

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: как уже упоминалось, это будет игнорировать все ошибки. Другой вариант - использовать handle.exe из пакета sysinternals для проверки наличия открытого дескриптора.

Другие вопросы по тегам