将文件列表从目录+子文件夹复制到另一个文件夹
Copy list of files from directory+subfolders to another folder
首先,我是一个完全的初学者。我正在尝试一个游戏的终极脚本 bat 文件解决方案。为了不打扰您的细节,让我告诉您我尝试做的事情。
示例:
- 我有 17 个文件。其中 10 个为 .jpg,其中 7 个为 .obj 文件。
- 图像在路径
\mods\images
中,对象在路径 \mods\models
中。
- 我想在
list.txt
中列出所有 17 个丢失的文件
- bat 文件将读取该列表,搜索文件并将它们粘贴到
TTSmissing
文件夹中
这是我的问题:
- bat 脚本只查看源路径,但不查看子文件夹(这就是我写
\mods\images\
、 来测试它是否有效) 所以
我基本上想要的是: \Tabletop Simulator\Mods\
作为源路径和
该脚本也应查看所有子文件夹。
list.txt
仅在文件名也有扩展名时才有效。是否可以更改脚本以便我不需要扩展名?所以它只会查找名称并复制文件? (示例:列表中的名称必须像:hello123.jpg
。仅在 hello123
时不起作用.)
- 如果我不想要 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
@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
)
)
您只想复制文件,因此 copy
比 xcopy
更易于使用。该代码将回显 copy
命令以测试它是否按您希望的方式工作。如果满意,去掉 copy 前面的 echo
和 运行 代码,重新做真正的复制过程。
一个for /d /r
循环将递归迭代%src_folder%
中的子目录。 pushd
将当前目录更改为每个子目录,以便可以相对于源文件工作。
for /f
循环将从 %file_list%
开始迭代每一行。简单的 for
循环将迭代每个 %ext_list%
。如果当前“name.extension”存在,则会复制到%dst_folder%
.
如果您 set
脚本中的变量名称,通常最好使用 setlocal
来保持脚本局部定义的变量。
要查看命令的帮助,请使用 command /?
。这将适用于代码中使用的许多命令。
查看 command /?
copy
、for
、if
、setlocal
...
的帮助
首先,我是一个完全的初学者。我正在尝试一个游戏的终极脚本 bat 文件解决方案。为了不打扰您的细节,让我告诉您我尝试做的事情。
示例:
- 我有 17 个文件。其中 10 个为 .jpg,其中 7 个为 .obj 文件。
- 图像在路径
\mods\images
中,对象在路径\mods\models
中。 - 我想在
list.txt
中列出所有 17 个丢失的文件
- bat 文件将读取该列表,搜索文件并将它们粘贴到
TTSmissing
文件夹中
这是我的问题:
- bat 脚本只查看源路径,但不查看子文件夹(这就是我写
\mods\images\
、 来测试它是否有效) 所以 我基本上想要的是:\Tabletop Simulator\Mods\
作为源路径和 该脚本也应查看所有子文件夹。 list.txt
仅在文件名也有扩展名时才有效。是否可以更改脚本以便我不需要扩展名?所以它只会查找名称并复制文件? (示例:列表中的名称必须像:hello123.jpg
。仅在hello123
时不起作用.)- 如果我不想要 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
@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
)
)
您只想复制文件,因此 copy
比 xcopy
更易于使用。该代码将回显 copy
命令以测试它是否按您希望的方式工作。如果满意,去掉 copy 前面的 echo
和 运行 代码,重新做真正的复制过程。
一个for /d /r
循环将递归迭代%src_folder%
中的子目录。 pushd
将当前目录更改为每个子目录,以便可以相对于源文件工作。
for /f
循环将从 %file_list%
开始迭代每一行。简单的 for
循环将迭代每个 %ext_list%
。如果当前“name.extension”存在,则会复制到%dst_folder%
.
如果您 set
脚本中的变量名称,通常最好使用 setlocal
来保持脚本局部定义的变量。
要查看命令的帮助,请使用 command /?
。这将适用于代码中使用的许多命令。
查看 command /?
copy
、for
、if
、setlocal
...