PowerShell删除项成功,但引发异常
我正在Mercurial存储库的根目录中运行以下命令。我想删除以.hg开头的任何文件和文件夹:PowerShell删除项成功,但引发异常,powershell,mercurial,Powershell,Mercurial,我正在Mercurial存储库的根目录中运行以下命令。我想删除以.hg开头的任何文件和文件夹: gci -rec -filter ".hg*" | remove-item -recurse -force 奇怪的是,它确实可以工作,但仍然会产生以下异常: Get-ChildItem : Could not find a part of the path 'C:\temp\WSCopyTest\MyCompany.Services.DaftPunk\.hg\'. At line:1 char:4
gci -rec -filter ".hg*" | remove-item -recurse -force
奇怪的是,它确实可以工作,但仍然会产生以下异常:
Get-ChildItem : Could not find a part of the path 'C:\temp\WSCopyTest\MyCompany.Services.DaftPunk\.hg\'.
At line:1 char:4
+ gci <<<< -rec -filter ".hg*" | remove-item -recurse -force
+ CategoryInfo : ReadError: (C:\temp\WSCopyT...es.DaftPunk\.hg:String) [Get-ChildItem], DirectoryNotFoundException
+ FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand
是否您正在删除一个以.hg开头的文件夹,该文件夹又包含一个以.hg开头的文件,但该文件已不存在?是否您正在删除一个以.hg开头的文件夹,该文件夹又包含一个以.hg开头的文件,但该文件不再存在?我希望Antony是正确的-在gci上使用-recurse将枚举匹配.hg*的文件和目录。将首先返回目录。然后删除项首先删除目录,-force开关删除其中的所有文件。然后它尝试删除该目录中与.hg*匹配的文件,这些文件在gci运行时就在那里,但现在已经不存在了。这将停止错误:
gci ".hg*" -recurse | select -expand fullname | sort length -desc | remove-item -force
按长度降序排列全名可确保在删除该目录中所有匹配文件之前不会删除任何匹配的父目录。我希望Antony是正确的-在gci上使用-recurse将枚举匹配.hg*的文件和目录。将首先返回目录。然后删除项首先删除目录,-force开关删除其中的所有文件。然后它尝试删除该目录中与.hg*匹配的文件,这些文件在gci运行时就在那里,但现在已经不存在了。这将停止错误:
gci ".hg*" -recurse | select -expand fullname | sort length -desc | remove-item -force
按长度降序排列全名可确保在删除该目录中所有匹配的文件之前,不会删除任何匹配的父目录。以下内容将限制其仅删除文件,并排除文件夹
gci -rec -filter ".hg*" | Where {$_.psIsContainer -eq $false} | remove-item -recurse -force
然后通过删除文件夹再次运行:
gci -rec -filter ".hg*" | Where {$_.psIsContainer -eq $true} | remove-item -recurse -force
以下内容将限制其删除仅限于文件,并排除文件夹
gci -rec -filter ".hg*" | Where {$_.psIsContainer -eq $false} | remove-item -recurse -force
然后通过删除文件夹再次运行:
gci -rec -filter ".hg*" | Where {$_.psIsContainer -eq $true} | remove-item -recurse -force
最后我把搜查和搬家分开了。我认为我的问题与管道默认工作方式有关,即一次一个项目,但我无法构建测试来检查它 在任何情况下,以下各项都可以正常工作:
$hgObjects = gci -rec | ?{ $_.name -like ".hg*" -and $_.name -ne ".hgignore" }
remove-item $hgObjects -force -recurse
使用此样式,remove-item cmdlet将获取找到的项的数组,并通过它们工作
我的原始示例中的.hg文件夹中没有任何名为.hg*的内容,因此我看不出发生了什么。它感觉更像是试图删除文件夹两次,我觉得很奇怪。我想知道它是否真的是这种标准.NET行为的PowerShell表现:
只要集合保持不变,枚举数就保持有效
不变。如果对集合进行了更改,例如添加,
修改或删除元素时,枚举数可能会失效并
下一次调用MoveNext或Reset会引发
无效操作例外。如果集合在
MoveNext和Current,Current返回其设置为的元素,
即使枚举数已经无效。
摘自
最后我把搜查和搬家分开了。我认为我的问题与管道默认工作方式有关,即一次一个项目,但我无法构建测试来检查它 在任何情况下,以下各项都可以正常工作:
$hgObjects = gci -rec | ?{ $_.name -like ".hg*" -and $_.name -ne ".hgignore" }
remove-item $hgObjects -force -recurse
使用此样式,remove-item cmdlet将获取找到的项的数组,并通过它们工作
我的原始示例中的.hg文件夹中没有任何名为.hg*的内容,因此我看不出发生了什么。它感觉更像是试图删除文件夹两次,我觉得很奇怪。我想知道它是否真的是这种标准.NET行为的PowerShell表现:
只要集合保持不变,枚举数就保持有效
不变。如果对集合进行了更改,例如添加,
修改或删除元素时,枚举数可能会失效并
下一次调用MoveNext或Reset会引发
无效操作例外。如果集合在
MoveNext和Current,Current返回其设置为的元素,
即使枚举数已经无效。
摘自
为什么不只删除文件夹呢?我认为Mercurial不会在.hg文件夹之外生成任何类似的文件。为什么不只删除文件夹呢?我不认为Mercurial会在.hg文件夹之外生成任何类似的文件。是的,我只是遇到了相同的问题,并使用了相同的修复程序。我注意到,当我将get childitem从remove item中拆分出来时,开始删除项目的时间要长得多。这表明get childitem会将第一个结果通过管道传输到下一个操作。在这种情况下,删除项会在可用时立即执行,并在完成后继续。是的,我刚刚遇到了相同的问题,并使用了相同的修复方法。我注意到,当我将get childitem从remove item中拆分出来时,开始删除要花费更长的时间
项目。这表明get-childitem将第一个结果通过管道传输到下一个操作。在这种情况下,只要项目可用,就将其删除,并在其完成后继续。这里的问题与它在一台机器上工作时的问题相同,但我在另一台计算机上遇到此错误。我怀疑如果有两组行为,则可能是powershell版本问题。这里的问题与它在一台计算机上工作的问题相同,但我在另一台计算机上遇到此错误。我怀疑如果有两组行为,则可能是powershell版本问题。