我的 Powershell 版本是 5.1.19041.1645
我想使用 txt 文件将音频文件从多个文件夹复制到另一个文件夹,其中 List.txt 文件中的歌曲名称与原始文件夹中的歌曲名称具有不同的结构。
我以链接为例:
search-and-copy-files-from-a-directory
我试过了:
$files = 'C:\Users\CMG\Desktop\List.txt'
$location = 'C:\Users\CMG\Desktop\Select Dance\'
$destination = 'C:\Users\CMG\Desktop\Select Dance Copy\'
Get-ChildItem $location -Filter *.mp3 |
Foreach-Object {
$content = $_.Name
$pos = $content.IndexOf("-")
$artistPart = $content.Substring(0, $pos)
$musicPart = $content.Substring($pos+2)
$pos2 = $musicPart.IndexOf(".")
$musileft = $musicPart.Substring(0, $pos2)
If ($pos2 -lt 36) {
$leng=$pos2
} else {
$leng=$pos2-($pos2-36)
}
$musicNameRight = $musileft.Substring(0, $leng)
}
gc $files | % {
$result = gci -Recurse $location$musicNameRight $_
if($result) {
write-host -ForegroundColor Green "found $_ in $location!"
write-host "copying $_ to $destination..."
copy-item $result.FullName $destination\$_
}
}
在 Foreach-Object 中,我设法从原始名称 ($location) 中消除了不同的部分,Artist Name -
并且.mp3
从 List.txt ($files) 中的名称中消除了,但我无法获取脚本来比较文件使用来自$musicNameRight
变量的信息。
“$files”路径中包含的歌曲名称:
Good Times (Dj 'S' Bootleg CMG Dance
“$location”路径中包含的歌曲名称:
Chic - Good Times (Dj 'S' Bootleg CMG Dance Re Mix).mp3
如何使脚本使用变量中名称的正确信息$musicNameRight
?
注意:
我定义$musicPart.Substring(0, 36)
了 ,因为 List.txt 文件中的所有歌曲名称都限制为 36 个字符。他们永远不会拥有更多。
根据我的理解,您只需要对
gci
变量参数值进行简单的调整,就足以对现有逻辑进行最小的更改。而不是使用
$result = gci -Recurse $location$musicNameRight $_
$result = gci -Recurse "$location*$_*"
改为使用添加一个尾随和一个前导的单个星号
$_
将作为通配符使用该Get-ChildItem
命令以递归方式返回它找到的所有匹配文件的结果。还要将包含星号的连接变量括在双引号中(即"$location*$_*"
)。PowerShell(选项 1)
不同的方法
使用
split
破折号 (-
) 作为分隔符,索引[1]
将提供与substrings
.list.txt
我也相信您根本不需要使用get-content
命令。$musicNameRight
使用变量周围的通配符,我将$result
使用它移动到同一个foreach-object
循环中以从那里执行条件复制。将带有变量的扩展名留在那里作为首选目标文件名是安全的。注意:如果您在原始名称后面加上名称和歌曲艺术家名称和歌曲名称加上扩展名,请使用
copy-item
条件下方的,If()
而不是在脚本中注释掉的(即Copy-Item $result.FullName -Destination $destination\$_;
)。PowerShell(选项 2)
支持资源
获取子项
ForEach-对象
分裂()
修剪()
如果()
String.Length 属性
比较运算符