在FOR循环内部比较

时间:2019-03-28 20:15:54

标签: batch-file

我正在尝试从文本文件中读取值/字符串的列表(它们在字母和数字之间有所不同),如果输出文本文件中存在值/字符串,则不执行任何操作,否则将其追加到文本文件中。

我花了3天多的时间进行研究并尝试各种事物和想法。 在我的搜索中,我遇到了与我需要做的事情非常相似的帖子(下面的链接),但是由于我是编程的新手,所以我没有人要寻求帮助,我希望你们能为我提供帮助。

Comparing Strings in Batch inside a for (if statement))

因此使用了与上面的帖子非常相似的内容,但是我不知道自己只是累了还是看不见我在哪里做错了事情。

@echo off
set ProjectNo=12345
set ProjectLocation=X:\Projects\123 ABC\45 WALL\G Drafting 12345\02 Models
set location=X:\Scripts
set areas=%location%\%ProjectNo%-AREAS.txt
set MAT=%location%\%ProjectNo%-MAT.txt

setlocal enableextensions enabledelayedexpansion


for /F %%a in ("%areas%") do (
    set "MA=%%a"
    setlocal EnableDelayedExpansion
    echo(!MA!
    pause
    if exist "!MA!"=="!MA:%MA%=!" (
        echo matched
        > nul
        ) else ( 
        echo nomatch
        > %MAT%
        )
        endlocal
    )
)

endlocal
pause 

12345-AREAS.txt的内容如下(当前):

01 
01 
10 
10 
10 
10 
130 
15 
15 
15
20 
20 
20 
20
25 
25 
25
30 
30 
30 
30 

此列表的值可能在10-300之间(变化很大)

我打算在输出文件12345-MAT.txt中获得的是单个且唯一的值,如下所示:

01
10
130
15
20
25
30

2 个答案:

答案 0 :(得分:3)

所以您追求的是独一无二的。

这是不需要延迟扩展的变体,
通过使用_[]

中包含的项目设置env vars
@echo off
set "ProjectNo=12345"
set "ProjectLocation=X:\Projects\123 ABC\45 WALL\G Drafting 12345\02 Models"
set "location=X:\Scripts"
set "areas=%location%\%ProjectNo%-AREAS.txt"
set "MAT=%location%\%ProjectNo%-MAT.txt"

Setlocal
:: clear env vars _[
for /f "delims=" %%A in ('set _[ 2^>Nul') Do set "%%A="

(for /f %%A in ('sort ^<"%areas%"')  Do if not defined _[%%A] (
    set "_[%%A]=1"
    Echo:%%A
  )
) > "%MAT%"

答案 1 :(得分:3)

这是一种简单的方法,可以对文本数据进行排序,逐行读取文本,将每行与上一行进行比较,仅在不匹配的情况下返回当前行:

auto *consoleWidget = new ConsoleWidget(this);
consoleWidget->logInfo("This is logging a message!");

此方法的优点是可以出现所有字符;缺点可能是性能不佳。