将文件复制到特定的子文件夹

Copy a file into a specific subfolder

"Here I am"-folder
  |
  |--- mainfolder 1
  |          |
  |          |--- subfolder 1
  |          |--- subfolder 2
  |
  |--- mainfolder 2
  |          |
  |          |--- subfolder 1
  |          |--- subfolder 2

我想将批处理文件放入“Here I am”文件夹并从那里执行。它应该将名为 text.txt 的文件复制到所有子文件夹 2 中。

尝试过:

@echo off 
Setlocal EnableDelayedExpansion 
cls 
set currentDirectory=%CD% 
FOR /D %%g IN ("*") DO ( 
   Pushd %CD%\%%g 
   FOR /D %%f IN ("*\Feedback Attachment(s)") DO ( 
      copy "%currentDirectory%\MarkSheet_Practical_4.xlsx" "%%~ff" 
   ) 
   Popd 
) 
pause

试试这个(更简单的)方法:

@echo off

FOR /f "usebackq tokens=*" %%f IN (`DIR /s /b "subfolder 2"`) DO (
    ECHO Copying text.txt from . to "%%f"
    COPY test.txt "%%f"
)

更多帮助:

  • FOR /?里面说明了off FOR的用法。
  • tokens=* 将来自 DIR 的完整 return 路径放入 1 个变量(由于文件名中的 space 而需要)

输出:

D:\TEMP>HereIambatchfile.bat
Copying text.txt from . to "D:\TEMP\mainfolder 1\subfolder 2"
        1 file(s) copied.
Copying text.txt from . to "D:\TEMP\mainfolder 2\subfolder 2"
        1 file(s) copied.

D:\TEMP>

该文件复制任务可以通过单个命令行使用批处理文件完成:

@for /F "delims=" %%I in ('dir "%~dp0subfolder 2" /AD /B /S 2^>nul') do @copy "%~dp0text.txt" "%%I\" >nul

FOR /F 带有包含在 ' 中的命令行导致在后台启动 cmd.exe 带有选项 /c 和命令行作为附加参数附加。所以在后台执行 Windows 安装到 C:\Windows:

C:\Windows\System32\cmd.exe /c "C:\Temp\Here I am\subfolder 2" /AD /B /S 2>nul

%~dp0 引用批处理文件参数 0 的驱动器和路径,该批处理文件路径始终以反斜杠结尾。在上面的示例中,假设批处理文件路径为 C:\Temp\Here I am\.

命令DIR搜索

  • 在指定目录下C:\Temp\Here I am
  • 并且在所有子目录中,因为选项 /S
  • 由于选项 /AD(属性目录)仅用于目录
  • 姓名subfolder 2的全称或简称
  • 并由于选项 /B 以裸格式输出找到的目录的名称,这意味着由于选项 /S.
  • 而仅使用具有完整路径的目录名称

如果找不到具有该名称的目录,DIR 会输出一条错误消息来处理 STDERR(标准错误),这是重定向到设备 NUL 以抑制它。

阅读有关 Using command redirection operators 的 Microsoft 文档,了解 2>nul 的解释。重定向运算符 > 必须在 FOR 命令行上使用脱字符 ^ 进行转义,以便在 Windows 命令解释器处理此命令时将其解释为文字字符执行命令 FOR 之前的行,它在后台启动的单独命令进程中执行嵌入式 dir 命令行。

后台命令进程DIR处理STDOUT(标准输出)的输出被cmd.exe处理捕获在 FOR 开始后由 FOR 处理的批处理文件 cmd.exe 在完成 DIR.

的执行后自行关闭

空行总是被 FOR 忽略,这里根本不会出现。

默认情况下,所有其他捕获的行将使用普通 space 和水平制表符作为分隔符拆分为子字符串(标记)。此处不需要此行拆分行为。因此 delims= 用于定义一个空的分隔符列表,导致根本不进行行拆分。 tokens=* 的用法也适用于此。它导致从所有行中删除前导 spaces/tabs 并将行的其余部分分配给指定的循环变量。所以 tokens=* 也可以在这种情况下使用,因为 DIR 输出的具有完整路径的所有目录名根本没有前导 spaces/tabs。

FOR 接下来会查看第一个子字符串的第一个字符(= 完全限定的目录名称)并忽略第一个字符上的行将是分号,分号是分号的默认结尾线字符。如果是 UNC 路径,完全限定的目录名称以驱动器号或反斜杠开头。所以这里可以保留默认的eol=;

目录名分配给指定的循环变量I并且FOR运行复制文件的命令COPY text.txt 将批处理文件目录中的 text.txt 添加到此目录中,通过使用 >nul 将其重定向到设备 NUL[= 来抑制成功消息输出以处理 STDOUT 110=].

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /? ... 解释了使用 %~dp0
  • 等修饰符引用批处理文件参数
  • copy /?
  • dir /?
  • for /?
命令行开头的

@ 会导致在执行前抑制命令的输出。 @ 可以在顶部包含 @echo off 的批处理文件中省略,这会关闭命令回显模式并抑制此命令的回显。 FOR 命令行仅执行一次,因此 @ 需要留给 FOR,但命令 COPY 被执行了多次,所以 @ 也必须用于命令 COPY 来抑制它的输出。可以删除第二个 @ 以获得 COPY 命令输出也进入控制台 window 以查看批处理文件的进度。