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

问题描述 投票:0回答:2
"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
batch-file windows-11
2个回答
0
投票

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

@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 /?
    解释了 FOR 的用法。
  • tokens=*
    DIR
    的完整返回路径放入 1 个变量(由于文件名中存在空格,因此需要该变量)

输出:

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>

0
投票

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

@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以抑制它。

阅读有关 使用命令重定向运算符的 Microsoft 文档,了解

2>nul
的说明。重定向运算符
>
必须在
FOR
命令行上使用脱字符号 ^ 进行转义,以便在 Windows 命令解释器在执行命令 FOR(执行嵌入的
dir
命令行)之前处理此命令行时将其解释为文字字符使用在后台启动的单独命令进程。

处理后台命令进程的STDOUT(标准输出)的DIR的输出是通过处理批处理文件捕获的,并在启动后由

FOR
处理cmd.exe在执行完
DIR后自行关闭
. 空行总是被

FOR

忽略,而这里根本不会出现。 默认情况下,所有其他捕获的行将使用普通空格和水平制表符作为分隔符拆分为子字符串(标记)。这里不需要这种分线行为。因此,

cmd.exe

用于定义一个空的分隔符列表,从而导致根本不进行行分割。

delims=
的用法在这里也适用。它会导致从所有行中删除前导空格/制表符,并将该行的其余部分分配给指定的循环变量。因此
tokens=*
也可以在这种情况下使用,因为
DIR
输出的所有带有完整路径的目录名称根本没有前导空格/制表符。

FOR

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

目录名称被分配给指定的循环变量

eol=;

并且

FOR
运行命令COPY,该命令将批处理文件目录中的文件I复制到此目录中,并抑制成功消息输出以通过以下方式处理
STDOUT
使用 text.txt 将其重定向到设备
NUL
要了解所使用的命令及其工作原理,请打开

命令提示符

窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

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

会导致在执行之前抑制命令的输出。在顶部包含

@
的批处理文件中,两个
@
都可以省略,这会关闭命令回显模式并抑制该命令的回显。
FOR
命令行仅执行一次,因此需要将@echo off留给
FOR
,但命令COPY会执行多次,因此必须使用@也留给命令
COPY
来抑制它的输出。可以删除第二个 @,以便将
COPY
命令输出也放入控制台窗口中,以查看批处理文件的进度。

© www.soinside.com 2019 - 2024. All rights reserved.