为什么我不能在Windowsbatch file中使用variables名称进行复制

我有一个c:\test目录,其中有一个文本文件var_list.txt与这3行:

ABC
XYZ
高清

我有一个C:\test\source目录,它有一个文本文件source_file.txt

我有一个空的C:\test\target目录。

我想写一个窗口batch file,这些任务:

  1. 在variables中逐行读取var_list.txt
  2. 对于每一行,将C:\test\source目录下的source_file.txt复制到C:\test\target目录下,同时在其名称中添加variables行

所以当我运行这个Windowsbatch file时,我想要它创build这3个文件:

  1. target_file_abc.txt
  2. target_file_xyz.txt
  3. target_file_def.txt

所以我在c:\test目录下创build一个windowsbatch filecreate_target_files.bat ,内容如下:

 @echo off for /f "tokens=*" %%a in (var_list.txt) do ( echo line=%%a copy /Y /VC:\test\source\source_file.txt C:\test\target\target_file_%a%.txt ) pause 

当我运行它时,我得到这个输出:

线= ABC
1个文件被复制。
线= XYZ
1个文件被复制。
行= DEF
1个文件被复制。
按任意键继续 。 。 。

但是在C:\test\target目录下只会创build一个文件target_file_.txt 。 为什么3个文件不是用variables名创build的?

你的代码有一个小错误。

 copy /Y /VC:\test\source\source_file.txt C:\test\target\target_file_%a%.txt 

在这行代码中,您使用%a%而不是%%a

既然你没有赋值变量, %a%会给你一个空白的字符串。

因此,所有复制的文件都被命名为target_file_.txt ,并被最后一个文件覆盖。

你可以这样做:

 @echo off setlocal enabledelayedexpansion for /f "tokens=*" %%a in ('Type "C:\test\var_list.txt"') do ( Set "line=%%a" echo !line! Copy /y /v "C:\test\source\source_file.txt" "C:\test\target\target_file_!line!.txt" ) pause & exit 

有关如何以及何时使用Enabledelayedexpansion的更多信息