创建批处理脚本以根据文件名的结尾将特定文件从一个文件夹复制到单独的文件夹
Create Batch script to copy specific files from one folder to separate folders based on ending of filename
这个问题是基于 here 发布的解决方案。
原始文件夹的名称如下:
1FT_DINRM_TASCAM_pt5GAL_TCL_clp.wav
1FT_DINRM_TASCAM_pt5GAL_TCL_lclp.wav
1FT_DINRM_TASCAM_pt5GAL_TCL.wav
我想创建 3 个单独的文件夹来将具有不同结尾的文件保存到单独的文件夹中,如下所示:
Files with xxx_clp to go into a folder, "Modified_originalClip"
Files with xxx_lclp to go into a folder, "Modified_originalLightClip" and
Files with none of the above endings, to go into a folder, "Modified_originalNoClip"
这是我想出的代码,位于同一个批处理文件中:
@%SystemRoot%\System32\robocopy.exe "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified" "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified_originalNoClip" *L.wav /NDL /NFL /NJH /NJS /R:3 /W:10
@%SystemRoot%\System32\robocopy.exe "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified" "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified_originalClip" *_clp.wav /NDL /NFL /NJH /NJS /R:3 /W:10
@%SystemRoot%\System32\robocopy.exe "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified" "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified_originalLightClip" *_lclp.wav /NDL /NFL /NJH /NJS /R:3 /W:10
是否可以使路径动态而不是硬编码?也就是说,从批处理文件所在的位置执行此操作。如果批处理文件位于如下位置:
| Original
| Modified_originalClip
|1FT_DINRM_TASCAM_pt5GAL_TCL_clp.wav
| Modified_originalLightClip
|1FT_DINRM_TASCAM_pt5GAL_TCL_lclp.wav
| Modified_originalNoClip
|1FT_DINRM_TASCAM_pt5GAL_TCL.wav
| filetofolder.bat
任何帮助将不胜感激!
我推荐使用以下可以存放在文件夹中的批处理文件:
G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass
G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified
批处理文件代码为:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if exist "%~dp0*.wav" (
for %%I in ("%~dp0.") do (
set "SourceFolder=%%~fI"
set "TargetFolder=%%~fI_original"
)
) else if exist "%~dp0Modified\*.wav" (
set "SourceFolder=%~dp0Modified"
set "TargetFolder=%~dp0Modified_original"
) else (
echo/
echo ERROR: Cannot find a *.wav file in the folders:
echo "%~dp0"
echo "%~dp0Modified\"
echo/
pause
goto EndBatch
)
if exist "%SourceFolder%\*_lclp.wav" %SystemRoot%\System32\robocopy.exe "%SourceFolder%" "%TargetFolder%LightClip" *_lclp.wav /NDL /NFL /NJH /NJS /R:3 /W:10
if exist "%SourceFolder%\*_clp.wav" %SystemRoot%\System32\robocopy.exe "%SourceFolder%" "%TargetFolder%Clip" *_clp.wav /NDL /NFL /NJH /NJS /R:3 /W:10
if exist "%SourceFolder%\*L.wav" %SystemRoot%\System32\robocopy.exe "%SourceFolder%" "%TargetFolder%NoClip" *L.wav /NDL /NFL /NJH /NJS /R:3 /W:10
:EndBatch
endlocal
表达式 %~dp0
引用参数 0 的驱动器和路径,它始终扩展为当前处理的批处理文件的完整路径,以反斜杠结尾。因此,对于上面的两个示例,%~dp0
是以下两个文件夹路径之一:
G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\
G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified\
批处理文件首先检查批处理文件的目录中是否至少有一个.wav
目录条目(希望是一个文件,而不是名称以.wav
结尾的目录)。这是存储在目录 G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified
.
中的批处理文件的情况
ROBOCOPY 像 REG 一样对参数字符串进行了不寻常的解析。这两个 Windows 命令将一个反斜杠 \
解释为一个反斜杠 \
或一个双引号 "
作为反斜杠的转义字符,分别是双引号,而左一个反斜杠任何其他字符都被解释为文字字符反斜杠。这种特殊的参数解析对于命令 REG 是有意义的,因为通常需要定义包含双引号的数据字符串,但在我看来对于命令 ROBOCOPY 因为文件夹路径或文件名不可能包含双引号字符。但是,该特殊参数解析意味着分配给环境变量 SourceFolder
的源文件夹路径和分配给环境变量 TargetFolder
的目标文件夹路径都不应该以反斜杠结尾,因为此反斜杠将被解释为转义字符对于 "
和 ROBOCOPY 会将所有内容解释为 "
终止 source/target 文件夹路径直到下一个 "
没有反斜杠留下尽管文件夹路径不能包含双引号字符,但它作为源文件夹路径和目标文件夹路径的一部分。
出于这个原因,命令 FOR 用于获取批处理文件的完整路径,没有附加反斜杠分配给环境变量 SourceFolder
。 %~dp0
后面的点表示当前目录。 %%~fI
的使用强制命令 FOR 访问文件系统,这导致确定文件夹路径的绝对路径和当前目录的相对路径部分 .
在文件夹路径的末尾。
分配给环境变量 TargetFolder
的目标文件夹路径在这种情况下是批处理文件路径,末尾没有反斜杠,但附加了 _original
。因此,批处理文件也可以存储在路径为 C:\Temp\MyWaves
且包含一个或多个 .wav
文件的文件夹中,在这种情况下,目标文件夹路径将为 C:\Temp\MyWaves_original
.
但是如果包含批处理文件的文件夹不包含任何 .wav
文件(目录条目),则批处理文件接下来检查批处理文件文件夹中是否有子文件夹 Modified
至少包含一个 .wav
个文件。如果批处理文件存储在文件夹 G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass
.
中,则该条件成立
如果批处理文件的文件夹中没有 .wav
文件,并且批处理文件夹的子文件夹 Modified
中也没有文件,批处理文件会输出相应的错误消息,暂停批处理文件执行,直到用户按下一个键,然后跳转到一个标签,导致退出批处理文件处理而不做任何事情。
接下来的三个IF条件首先检查在运行命令ROBOCOPY之前源文件夹中是否至少有一个文件匹配通配符模式 移动匹配通配符模式的文件。
三个 IF 条件 ROBOCOPY 在条件为真时执行的顺序可能非常重要,具体取决于通配符模式。
ROBOCOPY 在不存在的情况下自动创建整个目标文件夹树。因此没有必要使用 MD 或 MKDIR.
显式创建三个目标文件夹
批处理文件以恢复在批处理文件外部定义的执行环境结束。
要了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
... 说明如何从批处理文件中引用批处理文件参数,如此处所用,以引用 %~dp0
批处理文件的完整路径。
echo /?
endlocal /?
for /?
if /?
pause /?
robocopy /?
set /?
setlocal /?
这个问题是基于 here 发布的解决方案。
原始文件夹的名称如下:
1FT_DINRM_TASCAM_pt5GAL_TCL_clp.wav
1FT_DINRM_TASCAM_pt5GAL_TCL_lclp.wav
1FT_DINRM_TASCAM_pt5GAL_TCL.wav
我想创建 3 个单独的文件夹来将具有不同结尾的文件保存到单独的文件夹中,如下所示:
Files with xxx_clp to go into a folder, "Modified_originalClip"
Files with xxx_lclp to go into a folder, "Modified_originalLightClip" and
Files with none of the above endings, to go into a folder, "Modified_originalNoClip"
这是我想出的代码,位于同一个批处理文件中:
@%SystemRoot%\System32\robocopy.exe "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified" "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified_originalNoClip" *L.wav /NDL /NFL /NJH /NJS /R:3 /W:10
@%SystemRoot%\System32\robocopy.exe "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified" "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified_originalClip" *_clp.wav /NDL /NFL /NJH /NJS /R:3 /W:10
@%SystemRoot%\System32\robocopy.exe "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified" "G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified_originalLightClip" *_lclp.wav /NDL /NFL /NJH /NJS /R:3 /W:10
是否可以使路径动态而不是硬编码?也就是说,从批处理文件所在的位置执行此操作。如果批处理文件位于如下位置:
| Original
| Modified_originalClip
|1FT_DINRM_TASCAM_pt5GAL_TCL_clp.wav
| Modified_originalLightClip
|1FT_DINRM_TASCAM_pt5GAL_TCL_lclp.wav
| Modified_originalNoClip
|1FT_DINRM_TASCAM_pt5GAL_TCL.wav
| filetofolder.bat
任何帮助将不胜感激!
我推荐使用以下可以存放在文件夹中的批处理文件:
G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass
G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified
批处理文件代码为:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if exist "%~dp0*.wav" (
for %%I in ("%~dp0.") do (
set "SourceFolder=%%~fI"
set "TargetFolder=%%~fI_original"
)
) else if exist "%~dp0Modified\*.wav" (
set "SourceFolder=%~dp0Modified"
set "TargetFolder=%~dp0Modified_original"
) else (
echo/
echo ERROR: Cannot find a *.wav file in the folders:
echo "%~dp0"
echo "%~dp0Modified\"
echo/
pause
goto EndBatch
)
if exist "%SourceFolder%\*_lclp.wav" %SystemRoot%\System32\robocopy.exe "%SourceFolder%" "%TargetFolder%LightClip" *_lclp.wav /NDL /NFL /NJH /NJS /R:3 /W:10
if exist "%SourceFolder%\*_clp.wav" %SystemRoot%\System32\robocopy.exe "%SourceFolder%" "%TargetFolder%Clip" *_clp.wav /NDL /NFL /NJH /NJS /R:3 /W:10
if exist "%SourceFolder%\*L.wav" %SystemRoot%\System32\robocopy.exe "%SourceFolder%" "%TargetFolder%NoClip" *L.wav /NDL /NFL /NJH /NJS /R:3 /W:10
:EndBatch
endlocal
表达式 %~dp0
引用参数 0 的驱动器和路径,它始终扩展为当前处理的批处理文件的完整路径,以反斜杠结尾。因此,对于上面的两个示例,%~dp0
是以下两个文件夹路径之一:
G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\
G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified\
批处理文件首先检查批处理文件的目录中是否至少有一个.wav
目录条目(希望是一个文件,而不是名称以.wav
结尾的目录)。这是存储在目录 G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass\Modified
.
ROBOCOPY 像 REG 一样对参数字符串进行了不寻常的解析。这两个 Windows 命令将一个反斜杠 \
解释为一个反斜杠 \
或一个双引号 "
作为反斜杠的转义字符,分别是双引号,而左一个反斜杠任何其他字符都被解释为文字字符反斜杠。这种特殊的参数解析对于命令 REG 是有意义的,因为通常需要定义包含双引号的数据字符串,但在我看来对于命令 ROBOCOPY 因为文件夹路径或文件名不可能包含双引号字符。但是,该特殊参数解析意味着分配给环境变量 SourceFolder
的源文件夹路径和分配给环境变量 TargetFolder
的目标文件夹路径都不应该以反斜杠结尾,因为此反斜杠将被解释为转义字符对于 "
和 ROBOCOPY 会将所有内容解释为 "
终止 source/target 文件夹路径直到下一个 "
没有反斜杠留下尽管文件夹路径不能包含双引号字符,但它作为源文件夹路径和目标文件夹路径的一部分。
出于这个原因,命令 FOR 用于获取批处理文件的完整路径,没有附加反斜杠分配给环境变量 SourceFolder
。 %~dp0
后面的点表示当前目录。 %%~fI
的使用强制命令 FOR 访问文件系统,这导致确定文件夹路径的绝对路径和当前目录的相对路径部分 .
在文件夹路径的末尾。
分配给环境变量 TargetFolder
的目标文件夹路径在这种情况下是批处理文件路径,末尾没有反斜杠,但附加了 _original
。因此,批处理文件也可以存储在路径为 C:\Temp\MyWaves
且包含一个或多个 .wav
文件的文件夹中,在这种情况下,目标文件夹路径将为 C:\Temp\MyWaves_original
.
但是如果包含批处理文件的文件夹不包含任何 .wav
文件(目录条目),则批处理文件接下来检查批处理文件文件夹中是否有子文件夹 Modified
至少包含一个 .wav
个文件。如果批处理文件存储在文件夹 G:\DataSet\PlasticBagPops\Personal Data\NSULabGlass
.
如果批处理文件的文件夹中没有 .wav
文件,并且批处理文件夹的子文件夹 Modified
中也没有文件,批处理文件会输出相应的错误消息,暂停批处理文件执行,直到用户按下一个键,然后跳转到一个标签,导致退出批处理文件处理而不做任何事情。
接下来的三个IF条件首先检查在运行命令ROBOCOPY之前源文件夹中是否至少有一个文件匹配通配符模式 移动匹配通配符模式的文件。
三个 IF 条件 ROBOCOPY 在条件为真时执行的顺序可能非常重要,具体取决于通配符模式。
ROBOCOPY 在不存在的情况下自动创建整个目标文件夹树。因此没有必要使用 MD 或 MKDIR.
显式创建三个目标文件夹批处理文件以恢复在批处理文件外部定义的执行环境结束。
要了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
... 说明如何从批处理文件中引用批处理文件参数,如此处所用,以引用%~dp0
批处理文件的完整路径。echo /?
endlocal /?
for /?
if /?
pause /?
robocopy /?
set /?
setlocal /?