windows - 从文本文件复制文件的批处理脚本
问题描述
我需要以下代码的帮助,因为它仅在根文件夹中执行,而我希望代码也可以在子文件夹中查找文件。
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
C:\Temp
C:\Temp\
可以使用as done with%~dp0
但不能使用ROBOCOPY或C:\Temp\.
as done with%~dp0.
或 justC:\Temp
或 with C:\Temp\\
as done with来引用批处理文件文件夹,%~dp0\
这也适用于ROBOCOPY。有关详细信息,请参阅有关命名文件、路径和命名空间的 Microsoft 文档。
删除%~dp0
以使用当前文件夹作为源文件夹而不是批处理文件夹。
ROBOCOPY选项导致在/S
源文件夹及其所有子文件夹中搜索文件,并将找到的每个文件复制到目标文件夹,并在目标文件夹中复制源文件夹结构。
其他ROBOCOPY选项仅用于不打印创建目录列表、复制文件列表、标题和摘要。
这是此任务的替代命令行,用于将所有文件从源目录树复制到目标目录而不创建子目录。所以所有复制的文件最终都在指定的目标目录中。
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循环变量的每个文件名,内部FOR开始在后台再执行一个命令进程,并且DIR命令行作为附加参数附加。因此,对于安装了 Windows的每个文件名执行以下操作:I
%ComSpec% /c
documentation.txt
C:\Windows
C:\Windows\System32\cmd.exe /c dir "C:\Batch File Path\Current File Name.ext" /A-D-H /B /S 2>nul
后台搜索中秒执行的命令DIRcmd.exe
- 在批处理文件的目录中
- 及其所有子目录,因为选项
/S
- 由于选项而仅适用于非隐藏文件
/A-D-H
(属性不是目录且未隐藏) - 具有指定的文件名
- 并由于选项而以裸格式输出
/B
- 由于 option ,只有找到的具有完整路径的文件的名称
/S
。
DIR可能根本找不到符合这些条件的文件,在这种情况下,它会输出错误消息来处理后台命令进程的STDERR。2>nul
通过将其重定向到设备NUL来抑制此错误消息。
阅读有关使用命令重定向运算符的Microsoft 文章,了解2>nul
. 当 Windows 命令解释器在执行命令FOR之前在后台启动的单独命令进程中执行嵌入式命令行时,重定向运算符>
必须^
在FOR命令行上使用脱字符进行转义,以将其解释为文字字符。dir
内部FOR捕获为处理已启动的后台命令进程的STDOUT而编写的所有内容,并在完成DIRcmd.exe
执行后启动终止后逐行处理此输出。
内部FOR将每个完整的限定文件名分配给指定的循环变量J
,而不因选项delims=
而进行任何修改,然后运行命令COPY将该文件作为二进制文件复制到目标目录,并自动覆盖目标目录中具有相同文件名的现有文件。COPY输出的处理STDOUT的成功消息被重定向>nul
到设备NUL以抑制它。COPY将输出错误消息. 如果目标目录不存在,或者目标目录被写保护,或者同名的现有文件由于只读属性或文件权限而被写保护,或者源文件被应用程序打开,则会发生错误共享读取访问被拒绝,或现有目标文件被共享写入访问被拒绝的应用程序打开。
要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
call /?
...关于%~dp0
引用驱动器和参数 0 的路径的解释,它是当前由cmd.exe
.copy /?
dir /?
for /?
robocopy /?
推荐阅读
- python - 如何使用 PyTorch 删除所有维度为零的元素?
- java - 在单元测试中从超类转换为子类失败(模拟)
- visual-studio-2017 - CListCtrl 通过键入搜索:如何显示已键入的内容?
- kubernetes - 在 PhpStorm 上编辑和应用 Kubernetes 资源
- python - Python MagicMock.return_value 返回 MagicMock 而不是 return_value
- python - 如何在 pandas 中使用 if 函数
- amazon-web-services - 如何在调用 API 网关的 Lambda 函数中进行 Node.js 路由(可能使用 express)?
- r - 努力根据模式删除单词(R中的文本分析)
- django - 值比较查询 Django
- sql - 根据 SQL 中另一个表中的值从列中提取子字符串