为什么我不能在Windows批处理文件中使用变量名复制

时间:2017-03-22 19:56:44

标签: windows batch-file cmd

我有一个c:\test目录,其中包含以下3行的文本文件var_list.txt

  

abc
xyz
def

我有一个C:\test\source目录,其中包含一个文本文件source_file.txt

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

我想编写一个执行以下任务的Windows批处理文件:

  1. 在变量
  2. 中逐行阅读var_list.txt
  3. 每行将source_file.txtC:\test\source目录复制到 C:\test\target目录,文件名也在其名称中附加了变量行
  4. 因此,当我运行此Windows批处理文件时,我希望它创建这3个文件:

    1. target_file_abc.txt
    2. target_file_xyz.txt
    3. target_file_def.txt
    4. 所以我在create_target_files.bat目录中创建了一个包含以下内容的Windows批处理文件c:\test

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

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

        

      line = abc
                已复制1个文件。
      line = xyz
                已复制1个文件。
      line = def
                已复制1个文件。
      按任意键继续。 。 。

      但是在C:\test\target目录中,只创建了1个文件target_file_.txt。为什么不使用变量名创建3个文件?

2 个答案:

答案 0 :(得分:1)

您的代码中存在一个小错误。

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

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

由于您没有分配变量,%a%会给您一个空字符串。

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

答案 1 :(得分:0)

你可以这样做:

@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

的详细信息