Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 从文本文件复制文件的批处理脚本_Windows_Batch File_Cmd - Fatal编程技术网

Windows 从文本文件复制文件的批处理脚本

Windows 从文本文件复制文件的批处理脚本,windows,batch-file,cmd,Windows,Batch File,Cmd,我需要以下代码的帮助,因为它只在根文件夹中执行,而我希望代码也在子文件夹中查找文件 for /F "tokens=*" %%A in (documents.txt) do ( copy %%A E:\Destination\ ) 我建议在批处理文件中使用此命令行将具有复制目录结构的所有文件从源目录复制到目标目录 for /F "eol=| delims=" %%I in (documentation.txt) do %SystemRoot%\System32\rob

我需要以下代码的帮助,因为它只在根文件夹中执行,而我希望代码也在子文件夹中查找文件

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
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
假定文件
documentation.txt
包含一个没有路径的文件名列表

FOR的命令从文件
documentation.txt
中一行接一行地读取,并跳过空行。行尾字符从默认值修改为
eol=|
将代码>复制到
|
,以便能够复制名称以分号开头的文件。任何文件名都不能在任何位置包含竖条。通过使用选项
delims=
禁用空格/制表符上的行拆分行为,在本例中,该选项定义了一个空的字符串分隔符列表。因此,即使在从文件读取的文件名的开头有一个或多个空格的文件名也会被不加修改地分配给循环变量
I
。选项
tokens=*
从文本文件读取的行中删除前导空格/制表符。文件名可以以一个或多个空格开头,尽管这样的文件名并不常见

FOR针对每个文件名运行可执行文件ROBOCOPY,批处理文件的目录作为源文件夹路径,而
E:\Destination
作为目标文件夹路径ROBOCOPY将另一个
\
左边的
\
解释为转义字符。因此,源文件夹路径和目标文件夹路径不应以反斜杠结尾,因为这将导致
不被解释为文件夹路径的结尾,而是被解释为下一个
在命令行中。因此,
被附加到
%~dp0
,因为
%~dp0
总是扩展到以反斜杠结尾的批处理文件夹路径。批处理文件文件夹路径末尾的点引用批处理文件文件夹的当前文件夹。换句话说,对于存储在
C:\Temp
中的批处理文件,批处理文件文件夹可以用
C:\Temp\
引用,就像用
%dp0
一样,但不能用ROBOCOPY
C:\Temp\.
引用,就像用
%dp0.
引用一样,或者只用
C:\Temp
C:\Temp\\
引用一样使用
%~dp0\
,它也可以与机器人副本一起使用。有关详细信息,请参阅有关的Microsoft文档

删除
%~dp0
,将当前文件夹用作源文件夹,而不是批处理文件文件夹

ROBOCOPY选项
/S
会在源文件夹及其所有子文件夹中搜索文件,并将找到的每个文件复制到目标文件夹,同时复制目标文件夹中的源文件夹结构

其他ROBOCOPY选项仅用于打印创建目录列表、复制文件列表、标题和摘要


这是一个替代命令行,用于将所有文件从源目录树复制到目标目录,而不创建子目录。因此,所有复制的文件最终都位于指定的目标目录中

for /F "eol=| delims=" %%I in (documentation.txt) do %SystemRoot%\System32\robocopy.exe "%~dp0." "E:\Destination" "%%~I" /S /NDL /NFL /NJH /NJS
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的循环变量
I
的每个文件名开始,在后台再执行一个命令进程,并附加
%ComSpec%/c
DIR命令行作为附加参数。因此,对于
documentation.txt
中安装了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
  • 仅适用于非隐藏文件,因为选项
    /A-D-H
    (属性非目录且不隐藏)
  • 使用指定的文件名
  • 由于选项
    /B
  • 由于选项
    /S
    ,仅显示找到的具有完整路径的文件的名称
DIR可能根本找不到符合这些条件的文件,在这种情况下,它将输出错误消息以处理后台命令进程的STDERR。通过使用
2>nul
将此错误消息重定向到设备nul来抑制此错误消息

阅读Microsoft关于的文章,了解有关
2>nul
的解释。当Windows命令解释器在执行
FOR的命令之前处理此命令行时,重定向操作符
必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的dir命令行命令进程在后台启动

的内部FOR捕获为处理已启动后台命令进程的STDOUT而写入的所有内容,并在启动
cmd.exe后逐行处理该输出,在执行完DIR后,该输出被终止

由于选项
delims=
的原因,内部FOR将每个完全限定的文件名分配给指定的循环变量
J
,而不进行任何修改,然后运行命令COPY将该文件作为二进制文件复制到目标目录,并自动覆盖目标目录中的现有文件具有相同文件名的目录。通过COPY处理STDOUT输出的成功消息被
>nul
重定向到设备nul以抑制它。复制将输出一条错误消息。A.