Powershell 移动项目不移动所有文件

Powershell 移动项目不移动所有文件,powershell,Powershell,我有一个大约有500个mp3文件的闪存驱动器。 我试图将文件分成99个随机文件组,并将每个组移动到6个子目录中(这是因为我的汽车的播放器限制) 我希望提高效率,并使用我的PowerShell快速做到这一点: Get-ChildItem -File | Get-Random -Count 99 | % {Move-Item $_.fullname Dir_1} 奇怪的是,我一直发现结果是移动了75到97个文件,而不是精确的99个 最初,我假设Get Random不止一次返回几个文件,因此我检查了

我有一个大约有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个文件)时,会显示类似的结果


有什么想法吗?

当您使用带有位置参数的
移动项目$\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

第一个示例中的
-Count 11
有错误吗?您是否在任何可能隐藏某些
Move Item
调用失败这一事实的地方抑制错误?我的第一个示例应该是99(现在已修复)。我在选择不同的数字时也得到了类似的结果(在中也添加了),没有收到错误,也没有被抑制。名称中有
[
]
的文件吗
Get ChildItem-File | Get Random-Count 99 | Move Item-Destination Dir_1
yes-有些文件的名称中带有[或]。为什么会引起问题?