[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 难度较大的跨盘移动文件排除特定扩展名文件的批处理

各路大神,小弟想用windows下的bat批处理脚本,从aria2下载盘里移动已经下载完成的相关文件,但不能移动正在下载的文件,aria2正在下载文件有两个,一个是其文件名本本身,另外还有一个是的扩展名为.aria2的缓存文件,(比如正在下载的文件为a.mkv,同时有个文件名为:a.mkv.aria2)这些文件可能涉及到特殊符号,小弟才苏学浅,只能提出些思路,请大神指正。先用dir查询所有文件名到文本,然后将扩展名为aria2的文件名单独筛选出来,然后删除扩展名aria2,再从所有文件名中踢出这些,最后移动。这个思路是否可行,能否提供相应代码?感谢为先。

@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

TOP

回复 10# lin511321


    给dir命令加上 /s 选项
测试代码之前请做好备份

TOP

回复 9# ShowCode
我想提一个思路,用move把相关文件移动到本盘一个单独的目录,然后用XCOPY这个目录后,最后用RD来删除,这个想法应该能实现,大神你上面的脚本的问题,对本目录下的子目录不进行筛选,这个可以解决吧,再次感谢!

TOP

回复 7# lin511321


    move 命令本身不支持跨盘移动文件夹
测试代码之前请做好备份

TOP

还有只能移动当前目录下的文件,不能移动目录下子目录的文件。。

TOP

我修改了点:dir /s /b /o-d,可以移动目录了,但是唯一就是不能跨盘

TOP

回复 5# ShowCode
可以,但是不能移动当前目录下的文件夹,只能移动文件,不过代码够精简
不过谢谢兄弟,能否解决跨盘以及目录问题

TOP

回复 3# lin511321


试试这样能否解决第2个问题
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d ^| findstr /v "\.aria2$"') do (
  3.     if "%%i" neq "%0" (
  4.         if not exist "%%i.aria2" (
  5.             REM 如果演示结果没有问题,把下面的echo这4个字母删掉再执行
  6.             echo move /y "%%i" "C:\NewFolder\"
  7.         )
  8.     )
  9. )
  10. pause
复制代码
测试代码之前请做好备份

TOP

@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%"
修改了下,基本上可以移动所有文件了,但是不能保留目录结构,请大神们帮忙修改,谢谢

TOP

回复 2# ShowCode


  谢谢楼上的兄弟, 测试了下,有两个问题:
1、因为是跨盘,所以次目录下的子目录没有移动,比如我从D:\1这个目录所有文件及文件夹移动到 E:\2目录
2、另外把正在下载的文件移动了,.aria2这个缓存文件没移动,但是把其同名的那个文件移动了,如:正在下载的A.MKV,有这个文件本身以及扩展名为A.MKV.aria2这两个都不能移动。
再次谢谢楼上的兄弟。

TOP

  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d ^| findstr /v "\.aria2$"') do (
  3.     if "%%i" neq "%0" (
  4.         REM 如果演示结果没有问题,把下面的echo这4个字母删掉再执行
  5.         echo move /y "%%i" "C:\NewFolder\"
  6.     )
  7. )
  8. pause
复制代码
测试代码之前请做好备份

TOP

返回列表