我有一个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%"
有人可以帮忙吗?
答案 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"
使其正常工作