有没有人有任何想法为什么Remove-Item
将失败,而Delete
工程?
在下面的脚本中,我得到了一个我想要删除的文件列表。
使用Remove-Item
我得到以下错误信息:
VERBOSE:对目标“\\ UncPath \ Folder \ test.rtf”执行“删除文件”操作。 删除项目:无法删除项目\\ UncPath \ Folder \ test.rtf:访问path被拒绝。
但是使用Delete
就是在我们说话时删除这些文件。
脚本
$files = gci \\UncPath\Folder| ?{ $_.LastWriteTime -le (Get-Date).addDays(-28) } # This doesn't work $files | Remove-Item -force -verbose # But this does $files | % { $_.Delete() }
我终于可以复制这个和IMO似乎是一个错误。 repro是有一个像C $的开放共享,但为该文件上的用户设置拒绝修改权限。 当我这样做时,我观察到这一点:
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
参数也会删除文件而不会有错误。 拒绝烫发仍然允许我从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
不存在,如果失败,则尝试重置属性。
powershell可能会与UNC路径奇怪,我认为它与当前提供商的UNC路径前,你可以验证这一点:
cd c: test-path \\127.0.0.1\c$
返回TRUE
cd HKCU: test-path \\127.0.0.1\c$
返回FALSE
当指定完整路径时,我们告诉powershell使用文件系统提供程序 ,解决了这个问题。 您还可以指定提供程序,如remove-item filesystem::\\uncpath\folder