将文件复制到特定的子文件夹
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 以查看批处理文件的进度。
"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 以查看批处理文件的进度。