我在以下脚本中遇到麻烦,该脚本充分利用了管道:

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

运行此命令时出现以下错误,表示$ _为空:
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对象找到一个不少于该日期的文件时,它将在管道的其余部分中返回null。我相信此错误是在执行前发生的,因此这里存在一个更基本的问题。

该脚本的目的是删除不在目录中的所有早于2010年12月31日的文件。

最佳答案

两件事情。首先,您将要删除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}

关于powershell - 使用get-childitem时,Powershell Remove-Item项目为Null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26782025/

10-13 05:43