【问题标题】:Copy list of files from directory+subfolders to another folder将文件列表从目录+子文件夹复制到另一个文件夹
【发布时间】:2020-04-23 18:51:48
【问题描述】:

首先,我是一个完全的初学者。我正在尝试一个游戏的终极脚本 bat 文件解决方案。为了不打扰你的细节,让我告诉你我试图做什么。

例子:

  1. 我有 17 个文件。其中 10 个为 .jpg,其中 7 个为 .obj 文件。
  2. 图像在路径\mods\images中,对象在路径\mods\models中。
  3. 我想在list.txt 中列出所有 17 个丢失的文件
  4. bat 文件将读取该列表,搜索文件并将它们粘贴到 TTSmissing 文件夹中

这是我的问题:

  1. bat 脚本只查看源路径,而不查看子文件夹(这就是我写的原因\mods\images\测试它是否有效)所以 我基本上想要的是:\Tabletop Simulator\Mods\ 作为源路径和 该脚本也应查看所有子文件夹。
  2. list.txt 仅在文件名也有扩展名时有效。是否可以更改脚本,所以我不需要扩展名?所以它只会查找名称并复制文件? (示例:列表中的名称必须类似于hello123.jpg只有它时不起作用hello123。)
  3. 如果我不想要 list.txt 而只是将文件列表直接放入 bat 文件中,我需要如何更改 bat 脚本?
@echo off
mkdir %USERPROFILE%\Desktop\TTSmissing
set src_folder=%USERPROFILE%\Documents\My Games\Tabletop Simulator\Mods\Images
set dst_folder=%USERPROFILE%\Desktop\TTSmissing
set file_list=%USERPROFILE%\Desktop\list.txt

for /f "tokens=*" %%i in (%file_list%) DO (
    xcopy /S/E "%src_folder%\%%i" "%dst_folder%"
)
pause

【问题讨论】:

    标签: batch-file xcopy tabletop-simulator


    【解决方案1】:
    @echo off
    setlocal
    
    set "src_folder=%USERPROFILE%\Documents\My Games\Tabletop Simulator\Mods"
    set "dst_folder=%USERPROFILE%\Desktop\TTSmissing"
    set "file_list=%USERPROFILE%\Desktop\list.txt"
    set "ext_list=.gif .jpeg .jpg .mp4 .obj .pdf .png .webm"
    
    if not exist "%dst_folder%" md "%dst_folder%"
    
    for /d /r "%src_folder%\" %%A in (*) do (
        pushd "%%~A" && (
            for /f "usebackq delims=" %%B in ("%file_list%") do (
                for %%C in (%ext_list%) do (
                    if exist "%%~B%%~C" (
                        echo copy /y "%%~B%%~C" "%dst_folder%\"
                    )
                )
            )
            popd
        )
    )
    

    您只想复制文件,因此copyxcopy 更易于使用。该代码将回显copy 命令,以测试它是否按您想要的方式工作。如果满意,请删除复制前面的echo,然后再次运行代码以执行实际复制过程。

    for /d /r 循环将递归迭代%src_folder% 中的子目录。 pushd 会将当前目录更改为每个子目录,以便可以相对于源文件工作。

    for /f 循环将从%file_list% 迭代每一行。简单的for 循环将迭代每个%ext_list%。如果当前“name.extension”存在,它将被复制到%dst_folder%

    如果您在脚本中使用set 变量名称,通常最好使用setlocal 将定义的变量保留在脚本的本地。

    要查看命令的帮助,请使用command /?。这适用于代码中使用的许多命令。

    查看command /?copyforifsetlocal 的帮助...

    【讨论】:

    • (*.*) 不幸的是没有工作。这会立即导致 RAM 上升并且它没有找到单个文件(与之前相比,它至少找到了 jpg 文件)。这有点令人困惑。这对我来说毫无意义,为什么它可以完美地与只有几个文件的文件夹一起工作,但不能与有很多文件的文件夹一起工作。以及为什么它可以立即找到一些文件类型,但当 src 是一个包含大量文件的文件夹时,其他的却不能。也奇怪的是顺序。没有 *jpg,它会找到 pngs。没有 *.png 它会找到目标文件,尽管仍然存在 .mp4 扩展名等。
    • 我试过你的修改。顺便感谢您的努力,我很感激!不幸的是,您修改后的脚本正在这样做:它只找到具有第一个扩展名的文件。在您的修改中, obj 是第一个,因此它会找到所有对象。例如,当我将 jpg 放在第一个,将 obj 放在第二个时,它会找到所有 jpg 文件。但它不会在第一次扩展后找到所有其他的,它会再次陷入上升 RAM 错误。
    • 我已经更改了代码,以便findstr 不被用作for /f 现在读取列表文件。这一切都在迭代,所以希望性能会有所提高。
    • 这成功了!我不知道该怎么感谢你。你花了这么多时间来解决一个该死的初学者问题。不知道其他人是否会花费这么多时间和精力来提供帮助。现在它会在几秒钟内找到 list.txt 中的文件。 (顺便说一句,我将if not exist "%dst_folder%" md "%dst_folder%"command 添加到您改进的脚本中)非常感谢您!祝您在当前的艰难时期身体健康!
    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2012-05-05
    • 2013-05-21
    • 2020-12-15
    • 2011-08-22
    • 1970-01-01
    • 2023-01-14
    相关资源
    最近更新 更多