powershell - опция robocopy / List не откатывается назад, отказ в доступе к папке - PullRequest
0 голосов
/ 26 февраля 2020

Редактировать: Кроме того, причина, по которой я не использую ведение журнала через Robocopy, заключается в том, что он не хочет работать с / MT: либо. Все, что я получаю, это начальный и конечный статус sh с использованием ведения журнала robocopy.

Ниже приведен мой текущий скрипт для поиска определенных c файлов в сети с помощью robocopy. Отлично работает, особенно с многопоточностью. Тем не менее, я ищу в сетевых ресурсах и иногда сталкиваюсь с каталогом, к которому у меня нет доступа. Робокопия, похоже, обладает некоторой способностью отбрасывать сообщения об отказе в доступе, но я не смог заставить их работать с параметром / L. / MT: также иногда имеет тенденцию делать некоторые странные вещи с выводом. / V (многословный) не влияет на вывод при сочетании с /L.

Без / MT: set, я могу медленно вывести все каталоги и файлы в списке. Однако, если мне отказано в доступе к определенному каталогу, в выходных данных будет отображаться только родительский каталог, в котором мне изначально отказано.

Если я включу / MT: я все равно смогу найти файлы и папки, однако тогда журнал не выводит верхний родительский каталог по пути, к которому мне запрещен доступ.

Robocopy - мой единственный вариант из-за проблем с длинной дорогой в DIR и Get-childitem. До сих пор он работал быстрее всех из опций из-за многопоточности.

Разрешения не изменяются, и у меня нет прав администратора резервного копирования для переопределения запретов ACL.

Если кто-то знает как захватить журналы отказа / отказа, или есть подсказка, я был бы очень счастлив. Я знаю, что у меня есть отрицание, потому что в нижней части каждого журнала будет указано, сколько раз оно не удалось. Но если он перечисляет, сколько раз он выходил из строя, наверняка есть способ писать каждый раз индивидуально в журнал?

Чтобы настроить искусственный сбой дома, я использовал стандартную учетную запись для запуска ISE, и с помощью моего admin, создал каталог с некоторыми файлами, а затем другой подкаталог внутри, удалив все разрешения для каждого подкаталога и файлов внутри него, и изменил владельца на system. Все файлы были обнаружены, однако, подкаталог показывался только с верхней папкой, и он не мог искать глубже.

$ErrorActionPreference = 'continue'

remove-item C:\Users\$env:username\documents\log.txt

$measure= Measure-Command  -Expression{

$path = "C:\Users\$env:username\New folder" 

robocopy $path  null   /V /L /E /FP /XJD /XJF /R:1 /W:1 /MT:8  | % {

[string] $out=$_;

if(!($out.Contains("%"))){ECHO $out | Out-File "c:\users\$env:username\documents\log.txt" -Append}


} }



write-host $measure

1 Ответ

0 голосов
/ 26 февраля 2020

/ MT: x Определенно портит вывод в оперативной копии.

Я подозреваю, что ошибки проходят через поток ошибок (stderr), а не стандартный вывод (stdout)

Первый I добавил бы / np к вашим опциям. Таким образом, вам не нужно иметь дело с "%" позже.

Затем попробуйте использовать redirection . Я делаю это не очень часто, но я думаю, что 2> и 1> сделают это. Это может выглядеть примерно так:

robocopy $path $FakeDest /V /L /E /FP /XJD /XJF /R:1 /W:1 /MT:8 2>&1 > "c:\users\$env:username\documents\log.txt"

Также, если вы включите это в start-process , есть параметры для перенаправления как стандартного, так и потока ошибок. Снова не проверено, но это может выглядеть примерно так:

Start-Process -FilePath C:\Windows\System32\Robocopy.exe -ArgumentList "$path $FakeDestination /V /L /E /FP /XJD /XJF /R:1 /W:1 /MT:8" -RedirectStandardError C:\temp\Errors.txt -RedirectStandardOutput c:\temp\Output.txt

Очевидно, измените имена файлов ...

Если вы действительно хотите сойти с ума, есть модуль для NTFS-разрешений . У него есть командлеты типа Get-ChildItem2, основанные на API третьей части под названием AlphaFS (я думаю). он может получить доступ к путям за пределами типичного ограничения в 260 символов. Я уверен, что это будет медленнее, но если потерпеть неудачу в первых двух, это может стоить того. Я не знаю, как они реагируют на отказ в доступе ...

Извините, у меня нет времени для тестирования любого из этих подходов в данный момент. Тем не менее, дайте мне знать, если это поможет. Я буду рядом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...