尝试创建一个 Bat 文件,将单个文件复制到包含文件夹中的多个文件夹的文件夹中

尝试创建一个 Bat 文件,将单个文件复制到包含文件夹中的多个文件夹的文件夹中

我有一个名为 .nomedia 的文件。我试图将其复制到一个名为 Media 的文件夹中,而 Media 里面有 1000 个文件夹,这些文件夹又包括文件夹中的文件夹。我需要将 .nomedia 文件粘贴到所有这些子文件夹中的最后一个文件夹中。可以吗?

答案1

@echo off && setlocal enabledelayedexpansion  

cd /d "f:\Super_User" && set "_source=F:\Batch\source\.nomedia"
for /d /r %%i in (*)do tree /a "%%~fi" | find "\-" >nul||copy "!_source!" "%%~fi\"

endlocal && goto :eof 
  • 按常规格式:
@echo off && setlocal enabledelayedexpansion  

cd /d "f:\Super_User"                   // replace to full path to your root directory 
set "_source=F:\Batch\source\.nomedia"  // replace to full path to you file your file .nomedia

for /d /r %%i in (*)do tree /a "%%~fi"|find "\-" >nul||copy "!_source!" "%%~fi\"

endlocal 
  • 在命令提示符中(在根文件夹中)用一行执行相同的操作:
for /d /r %i in (*)do tree /a "%~fi"|find "\-">nul||copy "D:\Folder\source\to\your\file\.nomedia" "%~fi\"
  • 或者,...
for /d /r "F:\Super_User" %i in (*)do tree /a "%~fi"|find "\-" >nul||copy "F:\Batch\source\.nomedia" "%~fi\"

要获取子文件夹的最后一级,只需要检查每个子文件夹中是否有另一个文件夹,如果没有,则复制文件...

您可以使用for /d /r循环,它将遍历所有文件夹,并在循环内的每个文件夹中,将命令tree与命令一起使用find,您可以在其中检查当前文件夹是否有更多子文件夹,如果没有,则将文件复制到该级别的最后一个文件夹。

您可以在循环的所有子文件夹中使用(递归)tree "current_loop_folder" /afor /d /r,并通过检查每个输出查找“字符串”find "\-")重定向至运营商||并采取行动(copy)如果\-在命令tree输出中没有找到此字符串\\---test

Folder PATH listing
Volume serial number is A0AD-DC56
F:\SUPER_USER\Q1550103
\---test

上面的输出来自我所在的文件夹,F:\SUPERUSER\Q1550103这里有test子文件夹,但如果我在F:\SUPER_USER\Q1550103\test子文件夹中,我会得到以下输出:

Folder PATH listing
Volume serial number is A0AD-DC56
F:\SUPER_USER\Q1550103\TEST
No subfolders exist

如果find找不到字符串"\-",则当前文件夹中没有子文件夹,这是当前树中的最后一个文件夹:

F:\SUPER_USER\Q1550103\test

这种情况下,如果没有子文件夹的话,commandtree "Actual_Loop_Folder" /a | find "\-"命令就不会成功,那么就让操作员在你实际文件夹级别的最后一个文件夹中精确地||执行命令......copy

这将尝试说明||操作员如何机械地工作:

                    command1 || command2
             execute commad1 || only execute command2 (if) commad1 fails
     if tree folder /a fails || there is no subfolder in it
 there is no subfolder in it || this is the last subfolder
  this is the last subfolder || run copy file .nomedia
tree /a "%~fi"|find "\-">nul || copy"D:\Folder\source\to\your\file\.nomedia"
  • 有关操作员行为的更多信息,请参阅下面的链接参考条件执行

  • 注意:您需要编辑相关路径cd /dset _source=命令:

cd /d "f:\Super_User" && set "_source=F:\Batch\source\.nomedia" &&..... 

:: replace to ::
cd /d "f:\Super_User" // replace to full path to your root directory target

set "_source=F:\Batch\source\.nomedia" // replace to full path to you file your file .nomedia

答案2

我编写了这段代码,它似乎在我的测试中有效,就像你在这里看到的那样视频

@echo off
setlocal EnableDelayedExpansion

set "Filetocopy=C:\Users\Ricardo\Desktop\Copiar para ultima pasta\nomedia"
set "Folders=C:\Users\Ricardo\Desktop\Copiar para ultima pasta"

for /f "delims=" %%a in ('dir /b /s /ad "%Folders%" ^|sort /r') do (
Set /a Runs+=1
set "NameA=%%a"
if /i [!Runs!]==[1] Set "NameB="
if /i ["!NameB:%%a\=!"]==["!NameB!"] copy "!Filetocopy!" "!NameA!"
set "NameB=!NameA!\"
)

答案3

此批处理将 .nomedia 文件复制到 MYNOMEDIAFOLDERPATH 的所有 1000 多个子目录中

要在控制台中显示输出,请在复制命令行中删除 >nul,以免覆盖现有的 .nomedia 文件,请将 echo y|copy /-y 替换为 echo n|copy /-y

set "source=FULLPATHOF.nomedia"
for /f "delims=" %%D in ('dir /b /s /ad "C:\MYNOMEDIAFOLDERPATH\*") do (
  echo y|copy /-y "%source%" "%%~D">nul
)

要更改的参数

MYNOMEDIAFOLDERPATH  ... full path to your .nomedia file e.g.: C:\mylocaldir1\mylocaldir2\.nomedia
C:\MYNOMEDIAFOLDERPATH\* ... full path to your target directory e.g.: H:\myserverdir1\myserverdir2\*

如果你的路径中有空格,请使用“”将路径括起来
编辑
因此,对于你来说,这应该可行:

set "source=D:\Batch\source\.nomedia"
for /f "delims=" %%D in ('dir /b /s /ad "D:\Batch\Media\*") do (
  echo y|copy /-y "%source%" "%%~D">nul
)

相关内容