【问题标题】:Copy one file to one folder at a time where there are 100 files and 100 folders to copy using Batch file一次将一个文件复制到一个文件夹,其中有 100 个文件和 100 个文件夹要使用批处理文件复制
【发布时间】:2016-10-04 11:51:50
【问题描述】:

我有两个文件夹CopyFromCopyTo,其中CopyFrom 有100 个文本文件,名为1.txt100.txt,在CopyTo 文件夹中我有100 个文件夹,名为F1F100。现在,我想将CopyFrom 文件夹中的一个文件复制到CopyTo 中的一个文件夹中,这样F1 将包含1.txtF2 将包含2.txt,...,F100 将包含100.txt文件。

我知道复制所有可以使用For /d %%a in (C:\Users\me\Desktop\ShortCuts\*) do xcopy "C:\Users\me\Desktop\Time.xls" "%%a" 之类的文件夹,但我找不到将不同文件复制到不同文件夹的方法。

我可以回显CopyFrom 文件夹中的所有文件(For %%a in (C:\Users\me\Desktop\ShortCuts\*) Echo "%%a"),也可以回显CopyTo 文件夹中的所有文件夹,但无法弄清楚如何同时使用这两个文件来获得我想要的东西。

【问题讨论】:

  • 您没有明确说明目标文件夹是否与源文件命名相同,或者您是否只想将每个单独的源文件放入不同的未知命名目标文件夹中。
  • F1F2等所有文件夹在CopyTo位置是否已经存在?如果没有,是否必须创建它们?
  • @Compo,抱歉,CopyTo 文件夹有 100 个文件夹(例如 F1、F2、...F100),这些文件夹的名称与正在复制的源文件不同。当我说可以不同时,我的意思是,目标文件夹名称或源文件名称可以不同,正如我在示例中提到的那样。
  • @aschipfl, F1, F2,...F100 文件夹已经存在..
  • 我明白了。并且文件27.txt必须复制到文件夹F27(相同的数字),对吗?

标签: batch-file command-line cmd


【解决方案1】:
@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Configure paths
    set "copyFrom=c:\somewhere"
    set "copyTo=c:\anotherPlace"

    rem Generate two lists, one with files and one with folders
    dir /b /a-d "%copyFrom%\*" > "%temp%\copyFromFiles.txt"
    dir /b /ad  "%copyTo%\*"   > "%temp%\copyToFolders.txt"

    rem Assign each list as input to two streams and start processing    
    9< "%temp%\copyFromFiles.txt" 8< "%temp%\copyToFolders.txt" (
        call :matchFromWithTo
    )

    rem Remove generated lists
    del "%temp%\copyFromFiles.txt"
    del "%temp%\copyToFolders.txt"

    rem End
    goto :eof

:matchFromWithTo
    rem Read file from stream 9 and leave if nothing read
    <&9 set /p "file="   || goto :eof 
    rem Read folder from stream 8 and leave if nothing read
    <&8 set /p "folder=" || goto :eof

    rem Do the copy (debug: we will only echo the command)
    echo copy "%copyFrom%\%file%" "%copyTo%\%folder%"

    rem Keep reading until all files or folders are processed
    goto :matchFromWithTo

【讨论】:

  • 使用输入重定向的好主意!将/on 添加到dir 命令行以获得排序的输出(也在非NTFS 卷上)怎么样?
  • @aschipfl,谢谢。 "... 可以不同 ...." 让我放弃了这个选项。由于文件/文件夹名称之间没有明确的关系,我决定简单地以文件系统默认顺序进行迭代。
【解决方案2】:

假设源位置仅包含文件1.txt100.txt,而目标位置已包含所有F1F100 目录,则以下代码 sn-p 可能适合您:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "Pattern=*.txt"
set "CopyFrom=."
set "CopyTo=D:\Target"

for %%F in ("%CopyFrom%\%Pattern%") do (
    ECHO copy "%%~F" "%CopyTo%\F%%~nF\"
)

endlocal
exit /B

没有对目标位置进行枚举,复制目标只是从源文件名派生而来。

测试完脚本后,去掉大写的ECHO命令就可以真正复制文件了!

【讨论】:

  • 如果你能解释一下就好了copy "%%~F" "%CopyTo%\F%%~nF\"
  • 这会将每个源文件 (%%~F) 复制到以 %CopyTo% 为根并命名为 F 的文件夹中,后跟当前文件的基本名称(如果文件是 27.txt , %%~nF 等于 27;在命令提示符窗口中键入 for /? 并查看帮助文本的底部);最后的反斜杠确保目标是文件夹,而不是文件...
猜你喜欢
  • 2010-11-02
  • 2014-03-21
  • 2021-10-10
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多