将某些文件类型从子文件夹复制/移动到公共文件夹

将某些文件类型从子文件夹复制/移动到公共文件夹

情况:

大量子文件夹,文件夹名称随机,其中包含多个名称随机的文件。有些我想保留,有些可以删除。

目标:

将扩展名为 *.exe *.pdf *.avi 或其他指定扩展名的文件从子文件夹移出并移至一个公共单独文件夹,而无需重新创建以前的文件夹结构。这样我就有一个只包含我想要的文件的文件夹,而其他文件类型则保留在原处。然后记录子文件夹目录名称 (results-log.log) 并删除子文件夹及其中剩余的所有内容。

例如;开始:

  • 父母1
    • sub1
      • 随机数生成器
      • 随机2.pdf
      • 随机3.txt
    • sub2
      • 随机4程序
      • 随机5.avi
      • random6.log
      • 随机7.jpg

最终结果:

  • 父母2
    • 结果日志.log
    • 随机数生成器
    • 随机2.pdf
    • 随机4程序
    • 随机5.avi

因此,我搜索了其他答案,看起来我需要某种 FOR 循环,但我不太了解它如何与参数一起工作来完成我需要的工作。 将 pdf 文件从具有变量名称的子文件夹移动到父文件夹 是我看过的一个例子,我也看过推荐的阅读材料,但我完全不明白参数和变量是如何工作的。尤其是当我需要涵盖几种文件类型时。

到目前为止我正在研究这样的事情:

@ECHO OFF
SETLOCAL EnableExtensions
set "_parent=c:\logs\cache\"
set "_dest=c:\archive\"
for /D /r %%G in ("%_parent%\*") do (
  if exist "%%~G\*.pdf" (
    echo move /B "%%~G\*.pdf" "%_dest%\"
  ) else (
    echo nothing to copy "%%~G\*.pdf" "%_parent%\"
  )
)
  • 3号线我相信将“c:\logs\cache\”设置为父文件夹,因此在我的示例中,这等于“parent1”
  • 4号线应将目标文件夹(例如“parent2”)设置为“c:\archive”
  • 5号线正确吗%%G?字母是什么有关系吗?
  • 6号线我如何指定我想查找的其他文件扩展名?
  • 7号线我想使用move还是其他什么,/B参数是什么?/y是我所知道的唯一一个move

希望这些信息足够,可以根据需要进行编辑以获取更多信息。

答案1

if我认为你需要做的就是创建多个语句。因此,在你的循环中,它看起来应该是这样的:

IF exist "%%G\*.pdf" (
    move /Y "%%G\*.pdf" "%_dest%\"
    echo %%G>>"%_dest%\results-log.log
)

IF exist "%%G\*.exe" (
    move /Y "%%G\*.exe" "%_dest%\"
    echo %%G>>"%_dest%\results-log.log
)
IF exist "%%G\*.avi" (
    move /Y "%%G\*.avi" "%_dest%\"
    echo %%G>>"%_dest%\results-log.log
)

如果您想让消息保持不动,您可以随时设置一些变量(如果它进入其中一个IF语句内)并检查它是否已设置。

我不确定/B是什么,这对我来说看起来不对。我认为你说的对/y

可以G是任意字符,但不能超过一个字符。G是通常使用的。

我建议研究 powershell 脚本来处理此类事情。在我看来,用更少的代码行来做这样的事情更干净、更简单。可能有一个命令可以一次移动所有具有多个扩展名的文件,但据我所知,大多数版本的 DOS 通常不提供这种语法来移动。

编辑:

我已经在本地测试过了,它似乎对你的工作有用。你需要根据具体情况进行调整。

@ECHO OFF
SETLOCAL EnableExtensions enabledelayedexpansion
set _parent=c:\logs\cache\
set _dest=c:\archive\
set found=0

for /R  %_parent% %%G in (.) do (
    set found=0
    IF exist "%%G\*.pdf" (
        move /Y "%%G\*.pdf" "%_dest%\"
        set found=1
    )
    IF exist "%%G\*.exe" (
        move /Y "%%G\*.exe" "%_dest%\"
        set found=1
    )
    IF exist "%%G\*.avi" (
        move /Y "%%G\*.avi" "%_dest%\"
        set found=1
    )

    IF !found!==1 (
        rd /s /q "%%G"
        echo %%G>>"%_dest%\results-log.log"
    )
)

endlocal

/D在循环中使用选项for会将您正在运行脚本的当前目录附加到变量,%%G但我认为这不是您想要的。我上面写的方式基本上是说递归父目录中的所有文件夹并设置%%G为该位置(.)

您还必须添加,enabledelayedexpansion以便可以found在不同的块中使用该变量,然后您必须调用!found!而不是%found%使用它。这只是批处理脚本的一个奇怪怪癖。

如果所有这些语法对您来说都很奇怪,那么您并不孤单。您只需进行研究并进行自己的测试,看看会发生什么,直到您让它做您想做的事情。希望当您进入 powershell 时,您会发现使用 powershell ISE 进行调试和使用的语法要简单得多。

相关内容