我有一个文件夹结构,其中包含格式中的音乐文件,mp3
文件flac
夹结构如下所示:
S:\Music\
|___\ABBA
|___\...
|___\ZZTop
我正在尝试创建一个 Powershell 脚本,该脚本从目录(包括其子目录)中随机选择50 个文件Music
并将其放入另一个文件夹中。
我试过这个脚本,但它不起作用。
$d = gci "S:\Music\*.mp3" | resolve-path | get-random -count 50
Copy-Item $d -destination 'S:\Music\RandomFIles'
它抛出这个错误:Copy-Item : Cannot bind argument to parameter 'Path' because it is null.
为什么需要
| Resolve-Path |
?您需要将开关附加-File
到 Get-ChildItem,这样您就不会将 DirectoryInfo 对象与 FileInfo 对象一起检索。然后使用参数
.FullName
上的属性-Path
(这是第一个需要字符串数组的位置参数)参见Copy-Item
根据音乐收藏的大小,这可能需要一些时间才能完成
通过在递归迭代文件的文件夹内使用目标文件夹,您可能会遇到异常: “复制项目:无法用自身覆盖项目 blah.mp3。” 因此为避免这种情况,您需要附加
-ErrorAction SilentlyContinue
到 Copy-Item 命令。下面复制 .MP3 和 .FLAC 文件:
但是,如果您只想复制 .MP3 文件,请注意该参数的
-Filter
工作速度比-Include
但是..-Filter
只允许 ONE 文件名模式,例如 '*.mp3'-Include
允许名称模式数组,但只能在路径以\*
, 结尾或-Recurse
同时使用开关时使用在这两种情况下,请确保目标路径存在。
编辑
正如您所发现的,多次运行第一个代码块,每次运行的总数可能少于 50 个。这是因为
Get-Random -Count 50
可以返回已经在目标文件夹中的文件,并且上面的代码只是简单地复制它们。另外,对我来说,不清楚它
Get-Random -Count 50
本身是否不返回重复项。到目前为止,我还没有看到,但有可能在返回时,50 个项目可能并不总是唯一的。为了克服这个问题,下面确保复制的每个文件都没有在目标文件夹中找到,并且它将始终返回 50 个没有重复的文件。
但是有一个警告:
一遍又一遍地运行时,如果源文件夹中没有更多尚未复制的文件,您可能最终会出现一个 endess 循环。