0

我创建了循环遍历每一行的代码,files.txt并识别文件是还是car,并将此信息存储到. 这是通过使用命令并搜索 和 的列表来完成的。本质上代码的设计方式,它会取第一行,看看它是否可以找到字符串(如果是输出到),如果不是,它将搜索字符串(如果找到字符串,则输出to ),如果在 car.txt 或 中找不到该字符串,则将文本输出到boatneitherSendType.txtfindstrboat.txtcar.txtfiles.txtcar.txtcarSendType.txtboat.txtboat.txtboatSendType.txtboat.txtneitherSendType.txt

现在代码搜索整个字符串行。每个字符串都类似于11111_2222-22_2010-09-09_10-24-20.zip11111=ID、2222-22=model、2010-09-09=date、10-24-20=transaction ID)。

我想替换我当前的 findstr 行,它搜索整行,以搜索除日期部分之外的整个字符串。我在下面附上了我的代码以供参考,以及正在输入的文件的一些示例。提前致谢!

@echo off
FOR /F %%a in (files.txt) do (
findstr %%a car.txt
if errorlevel 1 (
findstr %%a boat.txt
    if errorlevel 1 (
    echo neither >>SendType.txt
) else (
    echo boat >>SendType.txt
)
) else (
    echo car >>SendType.txt
)
)

car.txt
11111_2222-22_2010-09-09_10-24-20.zip
11112_2222-11_2011-11-09_10-24-25.zip

boat.txt
11122_1111-22_2012-04-09_11-29-56.zip
11144_3333-11_2011-12-22_06-29-66.zip

files.txt
11122_1111-22_2000-01-01_11-29-56.zip
11144_3333-11_2000-01-01_06-29-66.zip
11155_1212-12_2000-01-01_11-19-69.zip
11111_2222-22_2000-01-01_10-24-20.zip
11112_2222-11_2000-01-01_10-24-25.zip
12345_2233-12_2000-01-01_07-27-44.zip

期望的输出:

SendType.txt
boat
boat
neither
car
car
neither

更新 10/15 下午 3:00 目前使用 dbenham 的代码和解析技术的方法如下:

@echo off    
>SendType.txt (  
for /f "tokens=1,2,3,4 delims=_" %%a in (filenames.txt) do (    
findstr /c:"%%a_%%b_%%d" sneakernet.txt >nul && (echo sneakernet) || (      
findstr /c:"%%a_%%b_%%d" devmed.txt >nul && (echo devmed) || echo tanto   
       ) 
    )
)
4

1 回答 1

2

如果 ID 的格式固定_为日期前的两个,那么解决方案很简单:只需使用 FOR /F 来解析值。

我喜欢使用&&and||而不是测试 ERRORLEVEL。此外,您不需要 FINDSTR 的输出,因此您可以重定向到 nul。您应该验证字符串是否从行首开始匹配。最后,您只需要重定向一次,因此您可以覆盖而不是追加 - 更容易重复测试,因为无需在开始前删除。

@echo off
>SendType.txt (
  for /f "tokens=1,2 delims=_" %%a in (files.txt) do (
    findstr /bc:"%%a_%%b" car.txt >nul && (echo car) || (
      findstr /bc:"%%a_%%b" boat.txt >nul && (echo boat) || echo neither
    )
  )
)


如果 ID 的格式(可能还有长度)可以变化,但日期部分的格式(长度)是恒定的,那么您可以使用子字符串:

@echo off
setlocal enableDelayedExpansion
>SendType.txt (
  for /f "delims=" %%a in (files.txt) do (
    set "ln=%%a"
    findstr /bc:"!ln:~0,-23!" car.txt >nul && (echo car) || (
      findstr /bc:"!ln:~0,-23!" boat.txt >nul && (echo boat) || echo neither
    )
  )
)


如果 ID 和日期格式都不是恒定的,那么我会通过剥离日期部分来更改boat.txt 和 car.txt 的内容。然后您可以使用 FINDSTR/G选项。由于FINDSTR/I中的错​​误,需要该选项。

car.txt
11111_2222-22
11112_2222-11

boat.txt
11122_1111-22
11144_3333-11

@echo off
setlocal enableDelayedExpansion
>SendType.txt (
  for /f "delims=" %%a in (files.txt) do (
    echo %%a|findstr /blig:car.txt >nul && (echo car) || (
      echo %%a|findstr /blig:boat.txt >nul && (echo boat) || echo neither
    )
  )
)

更新的答案

现在我了解了要求,这应该可以解决问题。我基本上在我的原始答案中使用了第一个代码的变体,并且我已经切换到使用正则表达式。通过替换正则表达式中[0-9]的每个,可以使测试更加严格。.

@echo off
>SendType.txt (
  for /f "tokens=1,2,4 delims=_" %%a in (files.txt) do (
    findstr /brc:"%%a_%%b_....-..-.._%%c" car.txt >nul && (echo car) || (
      findstr /brc:"%%a_%%b_....-..-.._%%c" boat.txt >nul && (echo boat) || echo neither
    )
  )
)
于 2012-10-15T20:50:34.963 回答