标题: [文件操作] 难度较大的跨盘移动文件排除特定扩展名文件的批处理 [打印本页]
作者: lin511321 时间: 2017-6-14 12:09 标题: 难度较大的跨盘移动文件排除特定扩展名文件的批处理
各路大神,小弟想用windows下的bat批处理脚本,从aria2下载盘里移动已经下载完成的相关文件,但不能移动正在下载的文件,aria2正在下载文件有两个,一个是其文件名本本身,另外还有一个是的扩展名为.aria2的缓存文件,(比如正在下载的文件为a.mkv,同时有个文件名为:a.mkv.aria2)这些文件可能涉及到特殊符号,小弟才苏学浅,只能提出些思路,请大神指正。先用dir查询所有文件名到文本,然后将扩展名为aria2的文件名单独筛选出来,然后删除扩展名aria2,再从所有文件名中踢出这些,最后移动。这个思路是否可行,能否提供相应代码?感谢为先。
作者: ShowCode 时间: 2017-6-14 13:30
- @echo off
- for /f "delims=" %%i in ('dir /b /a-d ^| findstr /v "\.aria2$"') do (
- if "%%i" neq "%0" (
- REM 如果演示结果没有问题,把下面的echo这4个字母删掉再执行
- echo move /y "%%i" "C:\NewFolder\"
- )
- )
- pause
复制代码
作者: lin511321 时间: 2017-6-14 16:41
回复 2# ShowCode
谢谢楼上的兄弟, 测试了下,有两个问题:
1、因为是跨盘,所以次目录下的子目录没有移动,比如我从D:\1这个目录所有文件及文件夹移动到 E:\2目录
2、另外把正在下载的文件移动了,.aria2这个缓存文件没移动,但是把其同名的那个文件移动了,如:正在下载的A.MKV,有这个文件本身以及扩展名为A.MKV.aria2这两个都不能移动。
再次谢谢楼上的兄弟。
作者: lin511321 时间: 2017-6-14 17:25
@echo off
set src=d:\1
set dest=e:\2
dir %src% /s /b /o-d > "2.txt"
findstr "aria2" 2.txt>a1.txt
copy a1.txt a.txt
del b.txt 2>NUL
echo strInput = "a.txt" >a.vbs
echo strOutput = "b.txt" >>a.vbs
echo Set objFSO = CreateObject("Scripting.FileSystemObject") >>a.vbs
echo Set objInput = objFSO.OpenTextFile(strInput, 1) >>a.vbs
echo Set objOutput = objFSO.OpenTextFile(strOutput, 2, True, 0) >>a.vbs
echo Do Until objInput.AtEndOfStream >>a.vbs
echo strLine = Replace(objInput.ReadLine, ".aria2", "") >>a.vbs
echo objOutput.WriteLine strLine >>a.vbs
echo Loop >>a.vbs
echo objInput.Close >>a.vbs
echo objOutput.Close >>a.vbs
cscript //nologo a.vbs
move /Y b.txt a.txt
del a.vbs
type a1.txt a.txt>1.txt
for /f "delims=" %%a in (1.txt) do set #%%a==
(for /f "delims=" %%a in (2.txt) do if not defined #%%a echo %%a)>3.txt
for /f "skip=3" %%i in (3.txt) do move /y "%%i" "%dest%"
修改了下,基本上可以移动所有文件了,但是不能保留目录结构,请大神们帮忙修改,谢谢
作者: ShowCode 时间: 2017-6-14 17:53
回复 3# lin511321
试试这样能否解决第2个问题- @echo off
- for /f "delims=" %%i in ('dir /b /a-d ^| findstr /v "\.aria2$"') do (
- if "%%i" neq "%0" (
- if not exist "%%i.aria2" (
- REM 如果演示结果没有问题,把下面的echo这4个字母删掉再执行
- echo move /y "%%i" "C:\NewFolder\"
- )
- )
- )
- pause
复制代码
作者: lin511321 时间: 2017-6-14 20:07
回复 5# ShowCode
可以,但是不能移动当前目录下的文件夹,只能移动文件,不过代码够精简
不过谢谢兄弟,能否解决跨盘以及目录问题
作者: lin511321 时间: 2017-6-14 20:10
我修改了点:dir /s /b /o-d,可以移动目录了,但是唯一就是不能跨盘
作者: lin511321 时间: 2017-6-14 20:57
还有只能移动当前目录下的文件,不能移动目录下子目录的文件。。
作者: ShowCode 时间: 2017-6-14 23:22
回复 7# lin511321
move 命令本身不支持跨盘移动文件夹
作者: lin511321 时间: 2017-6-15 11:50
回复 9# ShowCode
我想提一个思路,用move把相关文件移动到本盘一个单独的目录,然后用XCOPY这个目录后,最后用RD来删除,这个想法应该能实现,大神你上面的脚本的问题,对本目录下的子目录不进行筛选,这个可以解决吧,再次感谢!
作者: ShowCode 时间: 2017-6-15 23:46
回复 10# lin511321
给dir命令加上 /s 选项
作者: lin511321 时间: 2017-6-16 17:25
@echo off
set src=d:\1
set dest=d:\2
set dest2=e:\2
for /f "delims=" %%e in ('dir "%src%" /b /a-d ^| findstr /v "\.aria2$"') do (
if "%%e" neq "%0" (
if not exist "%%e.aria2" (
cd %src%
move /y "%%e" "%dest%"
)
)
)
dir %src% /s /b /o-d > "2.txt"
findstr "aria2" 2.txt>a1.txt
copy a1.txt a.txt
del b.txt 2>NUL
echo strInput = "a.txt" >a.vbs
echo strOutput = "b.txt" >>a.vbs
echo Set objFSO = CreateObject("Scripting.FileSystemObject") >>a.vbs
echo Set objInput = objFSO.OpenTextFile(strInput, 1) >>a.vbs
echo Set objOutput = objFSO.OpenTextFile(strOutput, 2, True, 0) >>a.vbs
echo Do Until objInput.AtEndOfStream >>a.vbs
echo strLine = Replace(objInput.ReadLine, ".aria2", "") >>a.vbs
echo objOutput.WriteLine strLine >>a.vbs
echo Loop >>a.vbs
echo objInput.Close >>a.vbs
echo objOutput.Close >>a.vbs
cscript //nologo a.vbs
move /y b.txt a.txt
del a.vbs
del b.txt 2>NUL
echo strInput = "a.txt" >a.vbs
echo strOutput = "b.txt" >>a.vbs
echo Set objFSO = CreateObject("Scripting.FileSystemObject") >>a.vbs
echo Set objInput = objFSO.OpenTextFile(strInput, 1) >>a.vbs
echo Set objOutput = objFSO.OpenTextFile(strOutput, 2, True, 0) >>a.vbs
echo Do Until objInput.AtEndOfStream >>a.vbs
echo strLine = Replace(objInput.ReadLine, "%src%", "") >>a.vbs
echo objOutput.WriteLine strLine >>a.vbs
echo Loop >>a.vbs
echo objInput.Close >>a.vbs
echo objOutput.Close >>a.vbs
cscript //nologo a.vbs
move /y b.txt a.txt
del a.vbs
dir %src% /b /ad > "3.txt"
(for /f "tokens=1* delims=\" %%c in (a.txt) do echo %%c)>1.txt
for /f "delims=" %%a in (1.txt) do (
for %%b in (3.txt) do (
echo %%b
(
findstr /v "%%a" "%%b"
)> #tmp# && move #tmp# "%%b">nul
))
for /f %%i in (3.txt) do move /y "%%i" "%dest%"
xcopy /s /e /i /y "%dest%" "%dest2%"
echo rd /q /s %dest%
pause
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |