Я новичок в мире кодирования, может ли кто-нибудь помочь мне со сценарием ниже?

Мне нужен пакетный скрипт для Windows, который выполняет следующие действия:

Просканируйте файл * .txt в папке «ARAT_Preverification», чтобы узнать, есть ли какие-либо «коды ошибок», такие как 503, 504, 511 и 611 (сценарий, упомянутый ниже);

Ниже приведен пример файла .txt, в котором каждая первая строка не содержит данных и может быть проигнорирована; в следующих строках содержатся данные, в которых пакет должен сканировать и находить коды ошибок (если есть) только между 18–20 символами, каждая строка содержит 90 символов, включая пробелы.

H0001200008143800120918155209
D43442371013477773520000001280012091800001 D4344237101172222 < сильный > 511 0000000900012091800001 D4344237100769292 < сильный > 504 0000007200012091800001

Если какой-либо файл * .txt имеет вышеуказанные коды ошибок, этот файл не следует перемещать в папку «Проверено», если коды ошибок не обнаружены, файл .txt следует переместить в папку «Проверено». У меня есть сценарий ниже, но он не обнаруживает коды ошибок в файле и

@echo off
set local
set "beg=^D................"
for %%F in (D:\ARAT\ARAT_Preverification\*.txt) do findstr /r "%beg%503 %beg%504 %beg%511 %beg%611" "%%F" >nul || move "%%F" D:\ARAT\ARAT_Verified
0
user9749652 14 Сен 2018 в 17:08

2 ответа

Лучший ответ
@echo off
setlocal enabledelayedexpansion

set "source=D:\ARAT\ARAT_Preverification\*.txt"
set "target=D:\ARAT\ARAT_Verified"
set "codes=503 504 511 611"
set "strings=/c:%codes: = /c:%"

if not exist "%target%" md "%target%"

for %%A in ("%source%") do (
    set "found="

    for /f "delims=" %%B in ('findstr %strings% "%%~A"') do (
        if not defined found (
            set "line=%%~B"

            if "!line:~,1!" == "D" (
                for %%C in (%codes%) do (
                    if "!line:~17,3!" == "%%~C" set "found=%%~C"
                )
            )
        )
    )

    if not defined found echo move "%%~A" "%target%"
)

Задайте коды ошибок для имени переменной codes.

Переменная с именем strings использует подстановку переменных для преобразования значения codes в аргументы для использования с findstr. Посмотреть set /? о замене переменных.

Если целевой каталог не существует, создается.

Начальный цикл for получает каждый исходный файл.

Вложенный цикл for использует findstr в текущем файле чтобы получить строки, соответствующие строкам. Соответствующие строки установлены в переменную с именем line. Если 1-й символ D, то второй вложенный цикл for проверит наличие трех цифровые коды от 17-го символа. Если код обнаружено, то будет определена переменная с именем found с кодом.

Если переменная с именем found не определена, то move операция происходит.

Удалите echo перед командой move, чтобы разрешить фактическая операция move, если проверка прошла успешно.

0
michael_heath 16 Сен 2018 в 07:33

Пожалуйста, попробуйте:

@echo off
setlocal enabledelayedexpansion

for %%x in (D:\ARAT\ARAT_Preverification\*.txt) do (
set "file=%%x"
for /f %%i in ('type "!file!"') do set "string=%%i"
    set "str=!string:~17,3!"
    for %%a in (504 503 511 611) do if "!str!"=="%%a" echo move "!file!" "D:\ARAT\ARAT_Verified"
)
0
Gerhard Barnard 14 Сен 2018 в 17:59