如何批量搜索特定符号的文本文件,并根据结果更改脚本

时间:2016-06-01 14:41:18

标签: batch-file cmd

我需要创建一个命令,允许我插入一个非常特定的符号(')的文本文件的检查,我遇到了麻烦。它是一个单引号,偶尔会在一些需要压缩的文件夹上找到,当我的批量拉链遇到带有符号的文件夹时,它只是开始出现很多问题并创建了奇怪的文件。我没有详细介绍,但我只需要一种方法(用简单的术语)检查文本文件是否包含符号('),如果是,则将脚本发送到错误行(只是指示某些内容)找到符号,例如"发现回声错误")。如果没有,那么只需将其发送到脚本的其余部分......

像FINDSTR"'" dirlist.txt 如果发现goto err else goto resume 我知道这是非常不正确的,但你明白了。

这是我到目前为止所做的工作,我仍然没有取得进展:

findstr /i /c:"’" C:\ACFZ\FORZIP\dirlist.txt >2
if %errorlevel% EQU 0 (goto LABEL0) else (goto LABEL1)

:LABEL0 
msg %username& "An invalid symbol has been found. Remove any single quotation marks (’) from the folder names and try again. If unsure, simply remove anything that looks like an apostrophe."
pause
goto ERROR

:LABEL1
echo No errors found, continuing
pause
goto ZIPSTART

:ERROR
echo an error was found, exiting...
pause
goto EXIT

它总是说没有错误,即使文件中有符号。

这是我需要搜索的文本文件(dirlist)

2082708  Amboy Bank
2082712  Cavender’s
2082736  Elizabeth Board of Education
2082763  Tri-Valley Developmental Services  LLC
2082773  Vector Management

2 个答案:

答案 0 :(得分:1)

好的,所以我终于让它正常工作......感谢Harvey,我使用了将任何结果输出到单独文件的方法,然后检查该文件的内容。这实际上很有用,因为如果它发现问题,它会显示问题文件夹的全名,以便您轻松修复它。

以下是工作部分的片段:

findstr "'" C:\ACFZ\FORZIP\dirlist.txt > error.txt
findstr "." error.txt >nul
  IF %ERRORLEVEL% EQU 0 GOTO POPUP 
  IF %ERRORLEVEL% EQU 1 GOTO ALLCLEAR

这里有更详细的内容:

CD C:\ACFZ\FORZIP
DIR /AD /B /ON >dirlist.txt

Echo Checking for errors in folder names...
ping -n 3 localhost >nul

REM that is not an apostrophe!
findstr "'" C:\ACFZ\FORZIP\dirlist.txt > error.txt
findstr "." error.txt >nul
  IF %ERRORLEVEL% EQU 0 GOTO POPUP 
  IF %ERRORLEVEL% EQU 1 GOTO ALLCLEAR

REM Errorlevel 0= Something found, 1= nothing found

:POPUP 
color cf
msg %username% "An invalid symbol has been found. Remove any single quotation marks (’) from the folder names and try again. If unsure, simply remove anything that looks like an apostrophe."
goto ERROR

:ALLCLEAR
echo No errors found, continuing...
ping -n 3 localhost >nul
ping -n 3 localhost >nul
goto ZIPSTART


:ERROR
echo An error was found in the following folder name(s) below:^


findstr "." error.txt

echo. 
Echo Remove any symbols from the above folder name(s)
echo within your completed folder and try again.
Echo This program will now exit.
pause
goto EXIT


:ZIPSTART
REM Zip contents of each directory
for /f "tokens=*" %%a in (dirlist.txt) do (
  CD "%%a"
  wzzip "C:\ACFZ\ZIPPED\%%a.zip"
  CD..
)

很高兴我能解决这个问题。我猜WinZip真的很疯狂。我需要这个的原因是我编写了这个批处理脚本(它比我上面的内容更多,因为这是我需要处理的部分)在我的工作中自动化压缩和备份过程,以便文件夹为将月份的作业压缩,然后复制到服务器上进行存档。手动操作很痛苦,所以我可以一步到位地完成所有操作。

哦,是的错误级别问题是我没有正确输入。我没有将它们放在右边。

感谢所有帮助过的人。

答案 1 :(得分:0)

%error_level%表示执行状态总是成功(0),除非您传入错误的参数(例如,尝试运行findstr而不带参数或文件名错误)。

在您的情况下,您需要检查findstr的输出(屏幕上打印的消息)。一种方法是依赖于如果findstr找不到与搜索匹配的字符串,则屏幕上不打印任何内容的事实。例如:

set found=""
findstr "'" C:\ACFZ\FORZIP\dirlist.txt > findresult.txt
call:CheckEmptyFile findresult.txt found
if "%found%" EQU "FOUND" (
    echo An invalid symbol has been found
) else (
    echo No errors found, continuing
)

REM your execution goes here

REM Clean up
del findresult.txt
goto :eof

:CheckEmptyFile
if %~z1 == 0 (
  set "%~2=NOTFOUND"
) else (
  set "%~2=FOUND"
)
goto :eof

(参考:Windows BAT : test if a specific file is empty