"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 /?
解释了 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>
该文件复制任务可以使用单个命令行通过批处理文件完成:
@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命令输出也放入控制台窗口中,以查看批处理文件的进度。