使用.txt日志文件将文件移动到多个文件夹

时间:2019-06-23 02:36:21

标签: regex batch-file cmd

我有一个logfile.txt,其中包含以下文本行:

C:\VIDEO\My Video 1\My Video 1.mkv
C:\VIDEO\MyVideo2\MyVideo2.mkv
C:\VIDEO\My.Video.3\My.Video.3.mkv

和包含文件的文件夹C:\ Temp:

My Video 1.mkv
MyVideo2.mkv
My.Video.3.mkv

我需要使用logfile.txt来匹配日志文件中列出的各自的filename.mkv,然后将文件移回其正确的文件夹(如日志文件中所示)。

例如,My Video 1.mkv应该移到C:\VIDEO\My Video 1\

C:\VIDEO中已经存在相关的文件夹,因此不需要创建。

如何为此编写批处理文件?

我现在从这样的事情开始,但是我现在陷入困境:

@echo off
setlocal enableDelayedExpansion
set "logfile=C:\Temp\logfile.txt"
set "SourcePath=C:\Temp"
set "DestPath=C:\VIDEO"

if exist ..\DestPath\nul rd /s /q ..\DestPath
if not exist ..\DestPath\nul md ..\DestPath

for /f "delims=: tokens=1*" %%A in ('findstr /n "^" "%logfile%"') do move "%SourcePath%\%%a" "%DestPath%"

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

如果使用%%~修饰符(请参阅for /?),很简单

for /f "tokens=*" %%A in (%logfile%) do ECHO move "%SourcePath%\%%~nxA" "%%~dpA"

注意:出于安全原因,我撤消了move命令的撤防。当您确定它可以正常工作时,请移除ECHO

(您看到我对previous question的回答了吗?)

答案 1 :(得分:1)

在PowerShell中也很容易。如果您确信文件将被正确移动,请从-WhatIf命令中删除Move-Item

=== Move-FilesToMultipleFolders.ps1

Get-Content 'C:\src\t\logfile.txt' |
    ForEach-Object { Move-Item -Path "C:\Temp\$(Split-Path $_ -Leaf)" $_ -WhatIf }

不应在脚本中添加别名,但这是单行代码。

gc 'C:\src\t\logfile.txt' | % { move "C:\Temp\$(Split-Path $_ -le)" $_ -WhatIf }

如果创建一个.bat文件脚本来运行它,请将.bat和.ps1文件都放在同一目录中。

=== Move-MultipleFilesToFolders.bat

powershell -NoLogo -NoProfile -File "%~dp0Move-MultipleFilesToFolders.ps1"

答案 2 :(得分:0)

因此,史蒂芬(Stephan)总的来说,答案是:

@echo off
setlocal enableDelayedExpansion
set "logfile=C:\Temp\logfile.txt"
set "SourcePath=C:\Temp"

@echo on & for /f "tokens=*" %%A in (%logfile%) do move "%SourcePath%\%%~nxA" "%%~dpA"

使其正常工作