我有一个闪存驱动器有大约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个移动)。
有什么想法吗?
当您使用带有位置参数的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