[英]Batch Script to copy files from a Text file
我需要以下代码的帮助,因为它仅在根文件夹中执行,而我希望代码也可以在子文件夹中查找文件。
for /F "tokens=*" %%A in (documents.txt) do (
copy %%A E:\Destination\
)
我建议在批处理文件中使用此命令行将所有具有重复目录结构的文件从源目录复制到目标目录。
for /F "eol=| delims=" %%I in (documentation.txt) do %SystemRoot%\System32\robocopy.exe "%~dp0." "E:\Destination" "%%~I" /S /NDL /NFL /NJH /NJS
假定文件documentation.txt
包含一个没有路径的文件名列表。
命令FOR从文件documentation.txt
中逐行读取,并跳过空行。 行尾字符从默认值修改;
到|
使用选项eol=|
能够复制名称异常以分号开头的文件。 任何文件名都不能在任何地方包含竖线。 使用选项delims=
禁用空格/制表符上的行拆分行为,在这种情况下定义一个空的字符串分隔符列表。 因此,即使在从文件读取的文件名开头也有一个或多个空格的文件名被原封不动地分配给循环变量I
。 选项tokens=*
删除从文本文件读取的行中的前导空格/制表符。 文件名可以以一个或多个空格开头,尽管这样的文件名并不常见。
FOR为每个文件名运行可执行ROBOCOPY ,其中批处理文件的目录作为源文件夹路径, E:\Destination
作为目标文件夹路径。 ROBOCOPY将另一个\
或"
左侧的\
解释为转义字符。因此,源和目标文件夹路径不应以反斜杠结尾,因为这将导致"
不被解释为文件夹路径的结尾,而是被解释为下一个"
在命令行中。因此.
附加到%~dp0
因为%~dp0
总是扩展为以反斜杠结尾的批处理文件夹路径。批处理文件夹路径末尾的点引用批处理文件夹的当前文件夹。 In other words with batch file stored in C:\Temp
the batch file folder can be referenced with C:\Temp\
as done with %~dp0
but not possible with ROBOCOPY or with C:\Temp\.
as done with %~dp0.
或仅使用C:\Temp
或使用C:\Temp\\
与%~dp0\
一样,这也适用于ROBOCOPY 。请参阅有关命名文件、路径的 Microsoft 文档 和命名空间了解详细信息。
删除%~dp0
以使用当前文件夹作为源文件夹而不是批处理文件夹。
ROBOCOPY选项/S
导致在源文件夹及其所有子文件夹中搜索文件,并将找到的每个文件复制到目标文件夹,并在目标文件夹中复制源文件夹结构。
其他ROBOCOPY选项仅用于不打印创建目录列表、复制文件列表、header 和摘要。
这是此任务的替代命令行,用于将所有文件从源目录树复制到目标目录而不创建子目录。 所以所有复制的文件最终都在指定的目标目录中。
for /F "eol=| delims=" %%I in (documentation.txt) do for /F "delims=" %%J in ('dir "%~dp0%%~I" /A-D-H /B /S 2^>nul') do copy /B /Y "%%J" "E:\Destination\" >nul
对于分配给外部FOR循环变量I
的每个文件名,内部FOR开始在后台使用%ComSpec% /c
和DIR命令行作为附加的 arguments 附加一个命令进程。 如此执行的是documentation.txt
中的每个文件名,其中 Windows 安装到C:\Windows
例如:
C:\Windows\System32\cmd.exe /c dir "C:\Batch File Path\Current File Name.ext" /A-D-H /B /S 2>nul
第二个cmd.exe
在后台搜索执行的命令DIR
/S
/ADH
仅适用于非隐藏文件(属性不是目录且未隐藏)/B
以裸格式输出/S
,只有找到的具有完整路径的文件的名称。 DIR可能根本找不到符合这些条件的文件,在这种情况下,它会 output 出现错误消息来处理后台命令进程的STDERR 。 通过使用2>nul
将其重定向到设备NUL来抑制此错误消息。
阅读有关使用命令重定向运算符的 Microsoft 文章,了解2>nul
的说明。 当 Windows 命令解释器在执行命令FOR之前处理此命令行时,重定向运算符>
必须在FOR命令行上使用脱字符^
进行转义,以使用在后台启动的单独命令进程执行嵌入式dir
命令行。
内部FOR捕获为处理启动的后台命令进程的STDOUT而编写的所有内容,并在启动cmd.exe
在完成DIR执行后自行终止后逐行处理此 output 。
由于选项delims=
,内部FOR将每个完整限定文件名分配给指定的循环变量J
而不进行任何修改,然后运行命令COPY将该文件作为二进制文件复制到目标目录,并使用相同文件自动覆盖目标目录中的现有文件姓名。 COPY处理STDOUT的成功消息 output 使用>nul
重定向到设备NUL以抑制它。 错误消息将是 output by COPY 。 如果目标目录不存在,或者目标目录被写保护,或者同名的现有文件由于只读属性或文件权限而被写保护,或者源文件被应用程序打开,则会发生错误共享读取访问被拒绝,或现有目标文件被共享写入访问被拒绝的应用程序打开。
要了解使用的命令及其工作原理,请打开命令提示符window,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
call /?
...对于%~dp0
引用驱动器和参数 0 的路径的解释,这是cmd.exe
当前处理的批处理文件的完整路径。copy /?
dir /?
for /?
robocopy /?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.