在批处理文件中设置操作

时间:2014-10-07 08:02:33

标签: batch-file set

我有两个文件,想要检查批处理脚本中是否有“包含”另一个文件。 'contains'是指第一个文件中的SET行包含第二个文件中的SET行。

例如此文件:

a
b
c
d
e
f
g

包含此文件:

a
b
d
g

但不包含此文件:

a
b
z

我意识到任务不是很复杂,但我想知道是否存在支持开箱即用的类似集合操作的命令行工具。例如,作为编写for循环的替代方法,该循环从第一个文件中的第二个文件中搜索每一行......

3 个答案:

答案 0 :(得分:1)

已修改原始帖子中的大多数代码都不需要,所以......

使用您的文件集(以相同顺序)fullList.txtlist1.txtlist2.txt命名,这应该有效

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "mainFile=.\fullList.txt"

    for %%f in (list*.txt) do (
        findstr /l /x /v /g:"%mainFile%" "%%~ff" >nul && ( 
            echo %%f is not included 
        ) || ( 
            echo %%f is included 
        )
    ) 

它是如何工作的?它只是每个文件的findstr命令。它在“小列表”文件中搜索未包含在“大列表”文件中的字符串。如果找到任何行,则不包含该文件,否则包含该文件

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
PUSHD "%sourcedir%"
SET "is_subset=Y"
FOR /f "delims=" %%a IN (subset_file.txt) DO (
 FIND "%%a" "superset_file.txt">NUL
 IF ERRORLEVEL 1 ECHO fail ON "%%a"&SET "is_subset=N"&GOTO done
)
:done
POPD
ECHO subset IN superset : %is_subset%

GOTO :EOF

这应该有用 - 但你的问题不清楚。这将检查超集是否包含子集的每个成员,但您可能正在搜索某些成员。

我在U:驱动器上使用了测试文件 - 您需要修改以适应。

答案 2 :(得分:0)

下面的解决方案以非常快的方式解决问题。作为附加数据,它显示大文件中未包含的小文件中的行:

@echo off
setlocal

for /F "delims=" %%a in (smallFile.txt) do set "line[%%a]=1"
for /F "delims=" %%a in (largeFile.txt) do set "line[%%a]="
set "anyLine="
for /F %%a in ('set line[ 2^>NUL') do set "anyLine=1"
if defined anyLine (
   echo Large file does NOT "contain" the small file. Lines not contained:
   echo/
   for /F "tokens=2 delims=[]" %%a in ('set line[') do echo %%a
) else (
   echo Large file "contain" the small file.
)