首页 > 解决方案 > 如何查找文件中的任何一个单词是否在一个很长的字符串中,该字符串在 CMD 批处理中经常更改

问题描述

我有这个文件名,它被放到 Windows 共享上的目录中,它需要位于用户本地计算机上的正确位置,具体取决于文件名中是否包含关键字之一。

例如:

z:\mailbox\in\Very_but#very-very!long#filenameWITH-keyword+in^it

z:可以从一组 win-7 或 win-10 机器访问哪里。在这些机器上,有这两个目录:

c:\incoming\special
c:\incoming\regular

如果文件名中嵌入了关键字之一,则需要将其复制到c:\incoming\special文件夹中,如果没有,则需要进入c:\incoming\regular文件夹。

我的关键字在一个文件中,例如,c:\keywords.txt 在任何给定时间(每 5 分钟检查一次)可能没有文件,或者z:\mailbox\in目录中只有一个文件。

所以,这就是我想出来的,但它不起作用:(批处理文件假设有一个文件要处理,我还没想好要做什么,如果还没有的话)

dir /b z:\mailbox\in > tmp.out
set /p file=<tmp.out
del tmp.out

set keyword_found_flag=0
for /F "tokens=*" %%keyword in (c:\keywords.txt) do (

echo %file% | find /i "%%keyword"
if errorlevel=0 set keyword_found_flag=1

)

无论是否找到关键字,错误级别始终为零

IF keyword_found_flag=1 (
    copy z:\mailbox\in\%file% c:\incoming\special
) ELSE (
    copy z:\mailbox\in\%file% c:\incoming\regular
)

我不确定在这里做什么。任何帮助表示赞赏

标签: windowsbatch-filecmd

解决方案


如果执行匹配,为什么不使用运算符 ( &&) 设置标志?


echo %file% | find /i "%%keyword" >nul && set keyword_found_flag=1 

您也不需要为您的进程创建/删除 tmp.out 文件,使用 double for to 作为 z:\mailbox\in 中的文件名,并使用另一个 for 检查 c:\keywords.txt 中包含的文件z:\mailbox\in 中的文件名...

@echo off

set "keyword_found_flag=" && for /f tokens^=* %%i in ('dir /on /b /a:-d "z:\mailbox\in\*.*"
')do for /F tokens^=* %%K in ('type c:\keywords.txt')do echo="%%~i"| find /i "%%~K" && (
     set "keyword_found_flag=1") || (set "keyword_found_flag=0")

或者...

@echo off 

set "keyword_found_flag=" && for /f tokens^=* %%i in ('dir /on /b /a: -d "z:\mailbox\in\*.*"
')do for /F tokens^=* %%K in ('type c:\keywords.txt')do echo="%%~i"|find /i "%%~K" >nul && (
set "keyword_found_flag=1" && copy /v "%%~dpnxi" "c:\incoming\special\" ) || (
set "keyword_found_flag=0" && copy /v "%%~dpnxi" "c:\incoming\regular\" )

推荐阅读