本帖最后由 lj670 于 2024-11-23 17:20 编辑
文件夹3内有若干mp3文件,根据“00.txt”文本列出的多个mp3文件名(每首一行,没有后缀名),从文件夹3移动至文件夹4内,如果有没找到的文件则创建一个"缺少.txt"文本并记录,我有一个脚本如下,可以根据文本移动文件,但对缺少的文件不能准确记录,求助各位大佬,谢谢!- <# :
- echo off&cls
- rem 根据一个txt文本文件内列出的多个文件名,从一个指定文件夹里查找出相应的文件并剪切/移动到另一个文件夹里
- cd /d "%~dp0"
- powershell -NoProfile -ExecutionPolicy bypass "Invoke-Command -ScriptBlock ([ScriptBlock]::Create([IO.File]::ReadAllText('%~f0',[Text.Encoding]::GetEncoding('GB2312'))))"
- echo;%#% +%$%%$%/%_% %z%
- pause
- exit
- #>
-
- $txtfile="00.txt";
- $oldfolder="C:\测试\3";
- $newfolder="C:\测试\4";
-
- if (-not (test-path -liter $txtfile)) {
- write-host ('"'+$txtfile+'" not found');
- exit;
- };
- if (-not (test-path -liter $oldfolder)) {
- write-host ('"'+$oldfolder+'" not found');
- exit;
- };
- if (-not (test-path -liter $newfolder)) {
- [void](md $newfolder);
- };
-
- $dic = New-Object 'System.Collections.Generic.Dictionary[string,int]';
- $text = [IO.File]::ReadAllLines($txtfile, [Text.Encoding]::GetEncoding('GB2312'));
-
- for ($i = 0; $i -lt $text.count; $i++) {
- $key = $text[$i].toLower();
- if (-not $dic.ContainsKey($key)) {
- $dic.Add($key, 0);
- }
- }
-
- # 获取指定文件夹中的所有mp3文件信息
- $filesInFolder = @(dir -liter $oldfolder -Filter "*.mp3" |? { $_ -is [System.IO.FileInfo] });
-
- # 用于记录缺少的文件名
- $missingFiles = @();
-
- # 遍历00.txt中记录的文件名,检查是否在文件夹中有对应的mp3文件
- foreach ($line in $text) {
- $fileNameToCheck = $line.Trim();
- $found = $false;
- foreach ($file in $filesInFolder) {
- if ($file.Name -eq $fileNameToCheck) {
- $found = true;
- break;
- }
- }
- if (-not $found) {
- $missingFiles += $fileNameToCheck;
- }
- }
-
- # 如果存在缺少的文件,将其记录到11.txt中
- if ($missingFiles.Count -gt 0) {
- $missingFiles | Out-File -FilePath "11.txt"
- }
-
- # 移动找到的mp3文件到新文件夹
- foreach ($file in $filesInFolder) {
- if ($dic.ContainsKey($file.Name.ToLower())) {
- write-host $file.FullName;
- $newfile = $newfolder.trimend('\') + '\' + $file.Name;
- move-item -liter $file.FullName $newfile;
- }
- }
复制代码
|