我在使用以下脚本时出现问题,该脚本大量使用管道:
$date = Get-Date -date "12/31/2010 00:00 AM" -format MM-dd-yyyy
$TDrive = "C:\Users\xxxx\Desktop"
(get-childitem -path $Tdrive -recurse -force -ErrorAction SilentlyContinue) |
?{ $_.fullname -notmatch "\\Alina_NEW\\?" } |
?{ $_.fullname -notmatch "\\!macros\\?" } |
?{ $_.fullname -notmatch "\\DO_NOT_DELETE\\?" } |
Where-Object {$_.LastAccessTime -lt $date} |
Remove-Item $_
运行此命令时出现以下错误,表示$ _为null:
Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
At line:13 char:13
+ Remove-Item $_
+ ~~
+ CategoryInfo : InvalidData: (:) [Remove-Item], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.R
emoveItemCommand
我不理解的是,为什么路径会为空?这是一个流畅的管道,如果不是,$ _的值应该在整个管道中持续存在?
我唯一想到的是当where-object找到一个不小于该日期的文件时,它会通过管道的其余部分返回null。我相信这个错误会在执行前发生,但是这里有一个更基本的问题。
此脚本的目的是删除列出的目录中不的所有文件,这些文件早于12/31/2010。
答案 0 :(得分:0)
两件事。首先,您需要找到gci找到的文件的Remove-Item Foreach 。其次,Remove-Item采用一条路径。尝试这样的事情:
$date = Get-Date -date "12/31/2010 00:00 AM" -format MM-dd-yyyy
$TDrive = "C:\Users\xxxx\Desktop"
(get-childitem -path $Tdrive -recurse -force -ErrorAction SilentlyContinue) |
?{ $_.fullname -notmatch "\\Alina_NEW\\?" } |
?{ $_.fullname -notmatch "\\!macros\\?" } |
?{ $_.fullname -notmatch "\\DO_NOT_DELETE\\?" } |
Where-Object {$_.LastAccessTime -lt $date} |
% {Remove-Item $_.FullName -WhatIf}