向批处理脚本循环添加条件以过滤掉 Windows 命令行中不需要的结果

问题描述 投票:0回答:1

我正在学习 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"
    )
)
batch-file command-line
1个回答
0
投票

如果没有对所需条件的明确解释,应该复制但被排除的文件名示例,不应复制但被复制以及任何其他不需要的操作,您实际上是在问一段字符串有多长,但是-

你可以尝试的是你的

for...%%f
循环

for /R "%PHOTO_MASTERS_DIR%" %%f in (*_%%i_*) do if "%%~xf" NEQ ".md5" (
 ECHO copy "%%f" "%COPIED_IMAGES_DIR%"
)

请注意,这显然只是为了验证目的而显示文件名。

IF 报告的命令正确,删除

echo
关键字以实际执行复制。

[未测试]

© www.soinside.com 2019 - 2024. All rights reserved.