我正在学习 Windows 命令行,并正在尝试一个项目来自动化我工作的流程,但遇到了问题。对于批处理脚本来说,这可能有点复杂,但我们还是决定尝试一下。
目前,我将文件 ID 列表设置为变量 located_file_ids。我想循环这些并检查设置为 PHOTO_MASTERS_DIR 的大目录,如果有任何文件包含这些 id 中的任何一个。
例如。文件 ID = c00023
-- sr_c00023_m145.tif = 匹配
如果有匹配项,我想将它们复制到设置为 COPIED_IMAGES_DIR 的文件夹中,如果该文件不在任何位置,我想将其添加到当前设置为剩余_ids 的变量中。
复制等都很好,但我在复制不应该的文件时遇到问题,所以我决定添加一些条件。
例如。文件 ID = c00023
过滤掉 .md5 文件的结果
sr_c00023_m145.md5 = 不匹配
过滤掉文件 id 前面有任何字母的结果
sr_bc00023_m145.tif = 不匹配
过滤掉文件id后面有任何数字的结果
sr_c00023015_m145.tif = 不匹配
添加条件使情况变得更糟,大多数应该匹配的文件现在都被跳过了。
这是相关的代码片段。如果您能看到问题所在,或者有如何完全重做此操作的提示,那将非常有帮助。
set "remaining_ids="
:: Loop for Photo Masters directory
for %%i in (%located_file_ids%) do (
set "found=false"
for /R "%PHOTO_MASTERS_DIR%" %%f in (*%%i*) do (
echo %%~nxf | findstr /R /C:"\<%%i\>" >nul && (
echo %%~nxf | findstr /R /C:"[a-zA-Z]%%i" >nul && (
rem Skip files with a letter directly in front of the file id
) || (
echo %%~nxf | findstr /R /C:"%%i[0-9]" >nul && (
rem Skip files with a number directly behind the file id
) || (
echo %%~nxf | findstr /I /C:"md5" >nul && (
rem Skip files containing "md5" anywhere in the filename
) || (
set "found=true"
echo %%f located
copy "%%f" "%COPIED_IMAGES_DIR%"
)
)
)
)
)
if !found!==false (
echo %%i not located
set "remaining_ids=!remaining_ids! %%i"
)
)
如果没有对所需条件的明确解释,应该复制但被排除的文件名示例,不应复制但被复制以及任何其他不需要的操作,您实际上是在问一段字符串有多长,但是-
你可以尝试的是你的
for...%%f
循环
for /R "%PHOTO_MASTERS_DIR%" %%f in (*_%%i_*) do if "%%~xf" NEQ ".md5" (
ECHO copy "%%f" "%COPIED_IMAGES_DIR%"
)
请注意,这显然只是为了验证目的而显示文件名。
IF 报告的命令正确,删除
echo
关键字以实际执行复制。
[未测试]