我创建了一个proxy function为Remove-Item
,它删除到回收站,而不是永久(使用代理,这样我可以无缝地更换rm
别名,不破坏第三方脚本)。代理功能不接受管道输入
但是,当文件传送到函数中时它不起作用。代理功能的心脏是这样的:
if ($PSBoundParameters['DeletePermanently'] -or $PSBoundParameters['LiteralPath'] -or $PSBoundParameters['Filter'] -or $PSBoundParameters['Include'] -or $PSBoundParameters['Exclude'] -or $PSBoundParameters['Recurse'] -or $PSBoundParameters['Force'] -or $PSBoundParameters['Credential']) {
if ($PSBoundParameters['DeletePermanently']) { $PSBoundParameters.Remove('DeletePermanently') | Out-Null }
$scriptCmd = {& $wrappedCmd @PSBoundParameters }
} else {
$scriptCmd = {& Recycle-Item -Path $PSBoundParameters['Path'] }
}
所以,我的自定义功能Recycle-Item
只有当Path
是唯一的参数调用。所以,类似Get-ChildItem .\temp\ | rm -DeletePermanently
的工作正常,但Get-ChildItem .\temp\ | rm
有错误,因为Path
传递给Recycle-Item
的是$null
。
我试过路过$Path
代替$PSBoundParameters['Path']
并试图泼洒@PSBoundParameters
像上面的呼叫$wrappedCmd
,但没有它似乎有很大的裨益。我已将params
从此函数复制到Recycle-Item
,以确保它期望从管道输入,但这似乎也没有帮助。其中一些更改似乎通过文件名传递,但不是完整路径,所以我不知道Remove-Item
内是否有一些魔术需要复制以处理管道中的文件对象。
Recycle-Item
仅仅是一个基本的功能:
function Recycle-Item($Path) {
$item = Get-Item $Path
$directoryPath = Split-Path $item -Parent
$shell = new-object -comobject "Shell.Application"
$shellFolder = $shell.Namespace($directoryPath)
$shellItem = $shellFolder.ParseName($item.Name)
$shellItem.InvokeVerb("delete")
}
管涌'GET-ChildItem'到'删除,Item'将绑定在'LiteralPath',前前后后管道不'Path' –