如何通过PowerShell读取文本文件中的JPG文件名并将对应文件移动至同名文件夹
解决PowerShell中按文本文件指定移动JPG文件的问题
我来帮你完善这段代码,核心是要从每个文本文件里精准提取对应的JPG文件名,然后高效找到并移动这些文件。原代码的主要问题是嵌套循环逻辑冗余,以及匹配文件的方式不够准确,下面是修正后的完整代码:
$path = "C:\Users\Yo\Desktop\Brunnar" # 目标文件夹路径 # 获取所有TXT文件 $txtFiles = Get-ChildItem -Path $path -Filter "*.txt" -File # 将所有JPG文件存入哈希表,键为文件名,值为文件对象,方便快速查找 $jpgLookup = @{} Get-ChildItem -Path $path -Filter "*.JPG" -File | ForEach-Object { $jpgLookup[$_.Name] = $_ } # 遍历每个TXT文件 foreach ($txtFile in $txtFiles) { $folderName = [io.path]::GetFileNameWithoutExtension($txtFile.Name) $targetFolder = Join-Path -Path $path -ChildPath $folderName # 确保目标文件夹存在(你说已经创建了,这一步可以保留做容错) if (-not (Test-Path -Path $targetFolder -PathType Container)) { New-Item -Path $targetFolder -ItemType Directory | Out-Null } # 读取TXT文件内容,提取所有JPG文件名 $content = Get-Content -LiteralPath $txtFile.FullName -Raw # 用正则匹配所有以R开头、.JPG结尾的文件名 $jpgNames = [regex]::Matches($content, 'R\d+\.JPG') | ForEach-Object { $_.Value } # 遍历每个提取到的JPG文件名,移动对应文件 foreach ($jpgName in $jpgNames) { if ($jpgLookup.ContainsKey($jpgName)) { $jpgFile = $jpgLookup[$jpgName] try { Move-Item -LiteralPath $jpgFile.FullName -Destination $targetFolder -Force Write-Host "已移动文件: $jpgName -> $targetFolder" } catch { Write-Warning "移动文件失败 $jpgName : $_" } } else { Write-Warning "未找到对应JPG文件: $jpgName" } } }
关键逻辑说明
- 哈希表存储JPG文件:把所有JPG文件按文件名存入哈希表,这样查找文件的时间复杂度是O(1),比每次遍历文件夹高效很多,尤其是文件数量多的时候。
- 正则提取文件名:用正则
R\d+\.JPG匹配文本里的JPG文件名(适配你给出的R0010313.JPG这类格式),如果文件名格式有变化,可以调整正则,比如R\w+\.JPG匹配R开头加任意字母数字的文件名。 - 容错处理:加入了
try/catch块处理移动时的异常(比如文件被占用),同时输出提示信息,方便排查问题。 - 简化循环逻辑:去掉了原代码里冗余的嵌套循环,直接遍历每个TXT文件处理,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Anton Sandström
相关产品推荐
相关产品推荐

