Отслеживание ошибок при копировании

Только вышел из отпуска, и уже аврал на работе, но время для PowerShell я всё равно выкроил😉

Вот например комрад Camelot подкинул следующую, интересную задачку: Скопировать n файлов, и вывести список нескопированных в текстовый файл (ну либо предварительно попробовать скопировать неудачников еще разок).

Copy-Item .\test* c:\windows\system32\ -ErrorAction "silentlyContinue" -ErrorVariable Failed

Этой командой файлы будут скопированы из одного места в другое, при этом ошибки не будут выдаваться на экран, но будут помещены в массив $Failed.

Теперь посмотрим содержимое одного из элементов этого массива с помощью команды Format-List с ключем -Force:

$Failed[0] | fl * -force

Станет видно что нам необходимо свойство TargetObject в котором содержится объект файла который не удалось скопировать. Поместим эти объекты в переменную $Files

$Files = $Failed | foreach {$_.TargetObject}

Ну и теперь можно поступать с ними по своему усмотрению, либо просто попробовать скопировать их еще раз:

Copy-Item $Files c:\windows\system32\

либо поместить их полные пути в текстовый файл:

$Files | foreach {$_.fullname} | Set-Content log.txt

Вот собственно и всё🙂

комментариев 6 to “Отслеживание ошибок при копировании”

  1. micronux Says:

    браво маэстро!🙂

  2. PiLoT Says:

    Мне интересно, у меня только глюк или нет… я создал структуру… (.txt — файлы, остальное папки)
    test
    -subtest0
    -subtest1
    —1.1
    —1.2
    —1.txt
    —2.txt
    -subtest2
    —2.1
    —2.2
    -subtest3
    —1.txt
    —2.txt
    -subtest4
    -1.txt
    -2.txt
    -Copy of 1.txt
    -Copy of 2.txt
    -log.txt

    при данном скрипте не копирутся папка subtest0… в масиве $Failed, нет ошибки, что не может скопировать subtest0 =) соответственно он ее и не пытается скопировать второй раз =)

  3. Xaegr Says:

    2 PiLoT: А покажите пожалуйста полную команду как вы её выполняете.

  4. PiLoT Says:

    собствено
    d:
    cd test

    Copy-Item .\* d:\test1\ -ErrorAction «silentlyContinue» -ErrorVariable Failed

    $Files = $Failed | foreach {$_.TargetObject}

    Copy-Item $Files d:\test1\

    $Files | foreach {$_.fullname} | Set-Content log.txt

  5. PiLoT Says:

    …ошибки в массиве смотрел

    $Failed | fl * -force

  6. Xaegr Says:

    Странно, у меня всё прекрасно копируется. А при невозможности копирования (если папка с таким именем уже есть) то $Failed наполняется…


Обсуждение закрыто.

%d такие блоггеры, как: