具有-Include参数的Move-Item引发“项目不存在”错误

时间:2018-10-26 15:53:25

标签: powershell

我有以下文件:

> dir ~
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a----        26-Oct-18   5:30 PM        2   xxx1
-a----        26-Oct-18   5:30 PM        2   xxx2
-a----        26-Oct-18   5:30 PM        2   xxx3
-a----        26-Oct-18   5:31 PM        2   yyy1
-a----        26-Oct-18   5:31 PM        2   yyy2
-a----        26-Oct-18   5:31 PM        2   yyy3
-a----        26-Oct-18   5:33 PM        2   zzz

我想将 xxx * yyy * 文件移动到另一个文件夹。所以我这样做:

Move-Item -Path ~\* -Include "xxx*", "yyy*" -Destination D:\temp

并得到一个错误:

Move-Item : Cannot move item because the item at '~\zzz' does not exist.

但是文件在那里,并且 Test-Path〜\ zzz 返回 true

Move-Item cmdlet中的错误还是预期的行为? 如果可以预期,我为什么要得到它?

3 个答案:

答案 0 :(得分:0)

您不需要-Include。像这样传递通配符参数

$tmp = "D:\temp"
Move-Item "yyy*", "xxx*" -Destination "$tmp"

上面的示例假定您的PowerShell在放置“ xxx”和“ yyy”文件的目录中-否则,您需要在通配符前面编写路径

答案 1 :(得分:0)

是的,这有点令人困惑,但是如果您阅读了整个帮助文本,您要尝试执行的操作,则Move-Item在管道中由Get-ChildItem开头,是的,它确实显示了-include,但是在管道的Get-ChildItem一侧(左侧)。

因此,作为最佳实践,Razorfen所说的只是询问您需要/想要的东西。始终,在进行此类破坏性工作之前,请进行非破坏性/无影响的完整性检查(即,帮助文件文本中显示的Get-ChildItem),以确保您获得了期望的结果。

以这种方式传递列表的事实,即使您仅使用扩展名也是如此,也会发生相同的错误。

Move-Item -Path 'D:\FileSource\*' -Include '*.txt' -Destination 'D:\FileDestination' -Verbose -WhatIf

# Results

What if: Performing the operation "Move File" on target "Item: D:\FileSource\DataSet.txt Destination: D:\FileDestination\DataSet.txt".
What if: Performing the operation "Move File" on target "Item: D:\FileSource\input.txt Destination: D:\FileDestination\input.txt".
Move-Item : Cannot move item because the item at 'D:\FileSource\processesoutput.csv' does not exist.
At line:1 char:1
+ Move-Item -Path 'D:\FileSource\*' -Include '*.txt' -Destination 'D:\F ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand

因此,完全可以满足工作要求。

Get-ChildItem -Path 'D:\FileSource\*' | Move-Item -Include '*.txt' -Destination 'D:\FileDestination' -Verbose -WhatIf

What if: Performing the operation "Move File" on target "Item: D:\FileSource\DataSet.txt Destination: D:\FileDestination\DataSet.txt".
What if: Performing the operation "Move File" on target "Item: D:\FileSource\input.txt Destination: D:\FileDestination\input.txt".
What if: Performing the operation "Move File" on target "Item: D:\FileSource\processesoutput.csv Destination: D:\FileDestination\processesoutput.csv".

答案 2 :(得分:0)

好吧……的确,这是Windows PowerShell引擎中的错误。 GitHub上有一个issue。 在PowerShell 6.0中,fixed通过调用SessionState.Path.GetResolvedPSPathFromPSPath的正确重载并传递cmdlet上下文对象来实现。