我有一个带有大约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个移动)。
有什么想法吗?
答案 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