2014-09-01 3 views
3

Кто-нибудь есть идеи, почему Remove-Item не сработает, пока Delete работает?Удалить-элемент не работает, Удалить


В приведенном ниже сценарии я получаю список файлов, которые я хотел бы удалить.
Использование Remove-Item я получаю следующее сообщение об ошибке:

VERBOSE: Выполнение операции "Удаление файла" на цель "\\ UncPath \ Folder \ test.rtf". Удалить-элемент: не удается удалить элемент \\ UncPath \ Folder \ test.rtf: доступ к пути запрещен.

, но с использованием Delete удаляет эти файлы, когда мы говорим.

Script

$files = gci \\UncPath\Folder| ?{ $_.LastWriteTime -le (Get-Date).addDays(-28) } 

# This doesn't work 
$files | Remove-Item -force -verbose 

# But this does 
$files | % { $_.Delete() } 
+0

, который работал на моей коробке PSV4. Какую версию вы используете? вы пытались указать полный путь: '$ files = gci \\ UncPath \ Folder | ? {$ _. LastWriteTime -le (Get-Date) .addDays (-28) | выбрать полное имя} ' –

+0

' $ PSVersionTable' возвращает 4.0 для 'PSVersion'.Добавляя 'select fullname', я теперь получаю errormessage, такой как« Remove-Item: Can not find path »\\ UncPath \ Folder \ @ {FullName = \ UncPath \ Folder \ test.RTF} ', потому что он не существует.' , –

+0

'$ files [0]' возвращает '\\ UncPath \ Folder \ test.RTF' –

ответ

2

Я могу, наконец, воспроизвести это, и ИМО кажется, что это ошибка. Репродукция должна иметь открытый ресурс, такой как C $, но для установки Deny Modify perms для пользователя в файле. Когда я делаю это, я наблюдаю это:

PS> gci '\\Keith-PC\C$\Users\Keith\foo.txt' | ri -for 
ri : Cannot remove item \\Keith-PC\C$\Users\Keith\foo.txt: Access to the path is denied. 
At line:1 char:43 
+ gci '\\Keith-PC\C$\Users\Keith\foo.txt' | ri -for 
+           ~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (\\Keith-PC\C$\Users\Keith\foo.txt:FileInfo) [Remove-Item], ArgumentExc 
    eption 
    + FullyQualifiedErrorId : RemoveFileSystemItemArgumentError,Microsoft.PowerShell.Commands.RemoveItemCommand 

PS> gci '\\Keith-PC\C$\Users\Keith\foo.txt' | %{$_.Delete()} # <== this works! 

Я также заметить, что удаление параметра -Force удаляет файл без ошибок, а также. Функция deny perms по-прежнему позволяет мне удалить файл из проводника Windows, что заставляет меня думать, что файл должен удалить. Так что же с использованием параметра -Force? Когда я вникать в ErrorRecord я вижу это:

Message  : Access to the path is denied. 
ParamName  : 
Data   : {} 
InnerException : 
TargetSite  : Void set_Attributes(System.IO.FileAttributes) 
StackTrace  : at System.IO.FileSystemInfo.set_Attributes(FileAttributes value) 
        at Microsoft.PowerShell.Commands.FileSystemProvider.RemoveFileSystemItem(FileSystemInfo 
       fileSystemInfo, Boolean force) 

Кажется, что параметр -Force пытается установить (скорее сброс) атрибуты и права доступа к файлу не позволяют ему, например:

PS> gci '\\Keith-PC\C$\Users\Keith\foo.txt' | %{$_.Attributes = 'Normal'} 
Exception setting "Attributes": "Access to the path is denied." 
At line:1 char:45 
+ gci '\\Keith-PC\C$\Users\Keith\foo.txt' | %{$_.Attributes = 'Normal'} 
+            ~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], SetValueInvocationException 
    + FullyQualifiedErrorId : ExceptionWhenSetting 

Так что мне кажется, что PowerShell должен сначала попробовать, как если бы -Force не присутствовал, и если это не удается, попробуйте сбросить атрибуты.

+0

Это имеет смысл. Kayasax решил мою непосредственную проблему * (tx снова) *, но будущие посетители больше выигрывают от этого, будучи принятым ответом. Я включил принятый ответ. –

+1

Я представил этот дефект. Если вы согласны, проголосуйте за него: https://connect.microsoft.com/PowerShell/feedbackdetail/view/962980/remove-item-force-fails-when-remove-item-succeeds-on-the-same-file –

7

PowerShell может действовать странно с пути UNC, я думаю, что дописывает путь UNC с текущим поставщиком вы можете проверить это с помощью:

cd c: 
test-path \\127.0.0.1\c$ 

возвращает значение TRUE

cd HKCU: 
test-path \\127.0.0.1\c$ 

возвращает FALSE

при указании FULLPATH мы говорим PowerShell использовать поставщик файловой системы, которая решает эту проблему. вы также можете указать провайдера, например remove-item filesystem::\\uncpath\folder

+0

Много thx для решения и объяснения –

+0

Хм, все еще не уверен, что это объясняет, что видит OP - что я не могу воспроизвести. Ошибка «access denied» означает '$ files | ri' находит файл, но не может удалить из-за perms. Я вижу это, когда я использую share for readonly. Если я использую общий ресурс администратора (C $), как вы делали выше, то элемент удаления успешно завершается. Фактически, то, что передается параметру LiteralPath Remote-Item в конвейере, - это полный путь провайдера 'PSPath' (LiteralPath имеет псевдоним PSPath - следовательно, связывание конвейера). То, что вы демонстрируете выше, заключается в том, что в качестве параметра проблемный путь '\\\' проблематичен. :-) –

+0

@KeithHill - fyi, возможно, вы правы. Дополнительное тестирование показывает, что, просто удалив параметр '-force', мой начальный скрипт также работает. –

Смежные вопросы