Move-Item不移动所有文件

时间:2017-12-25 20:36:24

标签: powershell

我有一个带有大约500个mp3文件的闪存驱动器(提供或接受)。 我试图将文件分成99个随机文件组,并将每个组移动到6个子目录(这是因为我的汽车玩家限制)

我希望提高效率并使用我的PowerShell快速执行此操作:

Get-ChildItem -File | Get-Random -Count 99 | % {Move-Item $_.fullname Dir_1}

奇怪的是,我一直发现结果最终会移动75或97个文件而不是精确的99个。

最初我假设Get-Random多次返回一些文件,所以我查了一下:

(Get-ChildItem -File | Get-Random -Count 99 | Sort-Object -Unique fullname).Count

但我得到的输出是99。

我将闪存驱动器切换到第二个 - 结果相同。 手动移动文件按预期工作。 使用不同的数字时会显示类似的结果(随机选择11个文件 - 8个移动)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

Move-Item $_.FullName与位置参数一起使用时,您需要使用-Path参数。此参数使用shell globbing形式,因此路径名中的某些字符的解释方式不同,例如[],您在注释中指出的文件名中会出现这些字符。

您可以使用-LiteralPath参数来避免这种情况。

Get-ChildItem -File | Get-Random -Count 99 | % {Move-Item -LiteralPath $_.fullname -Destination Dir_1}

(无论如何,明确参数是一个好主意。)

但比这更好的是利用管道。 -LiteralPath参数可以通过传入管道对象的属性名绑定,它的别名为-PSPath,它恰好也是来自Get-ChildItem的fileinfo对象的属性。这无论如何都简化了您的命令:

Get-ChildItem -File | Get-Random -Count 99 | Move-Item -Destination Dir_1