如何使用提示将文件复制到多个目录?

时间:2014-11-09 22:39:21

标签: windows command-prompt

我需要复制一个文件并将其粘贴到许多目录中,我可以在Windows提示符下使用单个命令执行此操作吗? 我试过这段代码,但它没有用:

> copy C:\main\folder-1\docs\file.txt C:\main\*\docs    

名称是说明性的,但其理念是:在" main"文件夹我有50个文件夹("文件夹-1","文件夹-2",...,"文件夹-50")...并且每个文件夹内#34;文件夹-N",我有另一个名为" docs"的文件夹。每次我创建一个文件到任何"文件夹-N \ docs"我需要将其粘贴到所有"文件夹-N \ docs"。

有可能吗?或者我真的需要按文件夹粘贴文件,文件夹?

2 个答案:

答案 0 :(得分:3)

直接从命令行:

for /D %x in (c:\main\*.*) DO COPY c:\main\folder-1\docs\file.txt %x\docs\file.txt

从BAT文件或CMD文件(而不是命令行),您需要再次转义%变量

for /D %%x in (c:\main\*.*) DO COPY c:\main\folder-1\docs\file.txt %%x\docs\file.txt

当然,如果子目录" docs"目录不存在于" main"的每个子文件夹中,迭代将打印错误。这就是为什么在我上面的例子中我明确指定复制到%x \ docs \ file.txt。如果我刚刚说'%x \ docs"作为副本的目标,它可能会创建一个名为" docs"它包含file.txt源代码的内容。

有关for循环herehere的更多信息:

或者只需输入"帮助"在命令提示符下。

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir\one"
:: Build list of directorynames
SET "dnames="
FOR /f "delims=" %%a IN ('dir /b /ad "%sourcedir%" ') DO (
  IF EXIST "%sourcedir%\%%a\docs\" SET "dnames=!dnames! "%%a""
)
FOR %%a IN (%dnames%) DO FOR %%b IN (%dnames%) DO IF NOT %%a==%%b (
 FOR %%s IN ("%sourcedir%\%%~a\docs\*") DO (
  IF NOT EXIST "%sourcedir%\%%~b\docs\%%~nxs" ECHO(COPY "%sourcedir%\%%~a\docs\%%~nxs" "%sourcedir%\%%~b\docs\%%~nxs"
 )
)
GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

为了测试目的,所需的COPY命令仅为ECHO在您确认命令正确后,将ECHO(COPY更改为COPY以实际复制文件。

我建议您在愤怒发布之前创建几个小子目录的测试子树。请记住,这"报告"可能会说将同一个文件从dir1和dir5复制到dir3但是因为文件实际上会从dir1复制到dir3而被释放,所以dir5的副本不会发生(当检查dir5的副本时,dir1的副本已经已经发生了。)

您可以通过将copy附加到>nul行来取消copy报告。

请注意,此例程一次面向一个文件并显示应执行的操作。以下例程应该做同样的事情,更短但不提供优雅的测试结构:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir\one"
:: Build list of directorynames
SET "dnames="
FOR /f "delims=" %%a IN ('dir /b /ad "%sourcedir%" ') DO (
  IF EXIST "%sourcedir%\%%a\docs\" SET "dnames=!dnames! "%%a""
)
FOR %%a IN (%dnames%) DO FOR %%b IN (%dnames%) DO IF NOT %%a==%%b (
 ECHO(xcopy /d "%sourcedir%\%%~a\docs\*" "%sourcedir%\%%~b\docs\"
)
GOTO :EOF

同样,报告xcopy,而不是为了测试目的而执行。