使用get-childitem时,Powershell Remove-Item项为Null

时间:2014-11-06 14:34:36

标签: powershell

我在使用以下脚本时出现问题,该脚本大量使用管道:

$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。

1 个答案:

答案 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}