Показать полную графическую версию : Поиск файла с похожим именем
unw1ck3d
14-02-2012, 10:10
Добрый день
Слабо еще знаком с команадми
Прошу Вашей помощи в решении рабочей задачки
Есть файл (KWTFCB_123.txt) в начале имени которого присутствует всегда один и тот же набор символов "KWTFCB", нумерация соответственно меняется. Это ответ на ранее посланный файл 123.txt.
В виду того, что количество этих сообщений огромно. Необходимо сделать батник, который будет брать за основу KWTFCB_123.txt и находить его пару 123.txt в другой директории.
Спасибо.
megaloman
14-02-2012, 16:28
Найти элементарно, но зачем? Что потом с этой парой файлов делать? А что делать, если соответствие не найдено? Какую утилитарную задачу Вы хотите решить?
unw1ck3d, например, так:
@echo off
setlocal enableextensions enabledelayedexpansion
set sFile=%~nx1
set sPath=%~2
if defined sFile (
if defined sPath (
if exist "%sPath%\%sFile:KWTFCB_=%" (
echo File [%sPath%\%sFile:KWTFCB_=%] found
) else (
echo File [%sPath%\%sFile:KWTFCB_=%] not found
)
) else (
echo Usage: "%~nx0" ^<File^> ^<Path^>
)
) else (
echo Usage: "%~nx0" ^<File^> ^<Path^>
)
endlocal
exit /b
Первым аргументом пакетного файла указываете путь к «KWTFCB_XXX.txt», вторым аргументом — путь к папке с его парой «XXX.txt». Например:
0001.cmd "E:\Песочница\0117\0002\KWTFCB_123.txt" "E:\Песочница\0117\0001"
P.S. Присоединюсь к вопросу коллеги megaloman'а.
unw1ck3d
15-02-2012, 08:55
megaloman, прошу меня простить, умолчал
задача сводиться к тому, что при успешном нахождении пары файлов выкидывать оба *.txt в третью директорию. Если же соответствие не найдено, то ничего не делать.
Причем KWTFCB_123.txt лежат все в одной директории, а поиск 123.txt происходит в многоуровневой директории.
Как можно производить поиск 123.txt в директории по всем папкам данной директории?
На самом деле задача еще больше. Первую часть мне удалось решить, а вот со второй частью справиться не хватило знаний. Команда help и все "вытекающие" мне не ясны.
Прошу Вас подсказать с какой литературой ознакомиться. Не могу понять операции с переменными.
На тот вопрос, который я задал Вам, мне предлагали решить задачу на C#.
Iska, спасибо за помощь!!!
Есть еще один вопрос. Есть ли возможность в батниках делать запрос на ввод с клавиатуры, для того, чтобы именовать файлы?
Спасибо.
Anonymоus
15-02-2012, 09:01
unw1ck3d, да, можно.
Set /P Var=Enter filename: ^>
Данный код выводит в консоль приглашение с текстом "Enter filename: >" и после ввода присваивает введённое значение переменной Var.
Ещё можете почитать Set /?
megaloman
15-02-2012, 11:15
Вариант1
@Echo Off
Set In1=E:\Delete\KWTFCB
Set In2=E:\Delete\123
Set Out=E:\Delete\KWTFCB_123
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
FOR %%k IN ("%In1%\KWTFCB_*.txt") DO (
Set kFile=%%~nxk
Set kFile=!kFile:KWTFCB_=!
FOR /R "%In2%" %%f IN (!kFile!) DO If Exist "%%f" Move /Y "%%k" "%Out%\" && Move /Y "%%f" "%Out%\"
)
Вариант2@Echo Off
Set In1=E:\Delete\KWTFCB
Set In2=E:\Delete\123
Set Out=E:\Delete\KWTFCB_123
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
FOR %%k IN ("%In1%\KWTFCB_*.txt") DO (
Set kFile=%%~nxk
Set kFile=!kFile:KWTFCB_=!
FOR /F "usebackq delims=" %%f IN (`Dir "%In2%\!kFile!" /b /s /A:-D`) DO Move /Y "%%k" "%Out%\" && Move /Y "%%f" "%Out%\"
)
Какой способ быстрее-не исследовал, подозреваю - второй. В любом случае надо определить Ваши реальные папки In1 In2 Out (без \ на конце). Первый способ наверное можно чуть ускорить, но это не принципиально
unw1ck3d
15-02-2012, 14:01
Полная задача выглядит так:
В исходной директории с:\365-P\First хранятся запросы 123*.txt, разбросанные по папкам по следующей структуре
C:\365-P\First\Out\2012\01\10 (C:\365-P\YYYY\MM\DD)
Пользователь "ручками" отправляет документ 123*.txt на проверку. Файлы 123*.txt проходят проверку и сваливаются в виде ответов в одну папку без структуры c:\365-P\For_check\.
Отбор файлов происходит по одной строке "20@@@" внутри каждого KWTFCB_*.txt. Если строка присутствует в файле, то он падает в папку c:\365-P\For_check\Done. Если такой строки нет, то c:\365-P\For_check\Error.
Используя часть чужого кода, создал следующее:
cd For_check
findstr /l /m /x /c:20@@@ >>baselist.ext *.txt
Set List=baselist.ext
Set Dst=C:\365-P\For_check\done
if not exist %List% (
echo List-file not found!
exit 1
)
Set log="%~dpn0.log"
Set tmp="%~dpn0.tmp"
Set wrk="%~dpn0.lst"
echo ======= %date% %time:~0,8% =======>>%log%
del /f %wrk% 2>nul
dir /a /b /on /s>%tmp%
for /f "usebackq tokens=* delims=" %%F in ("%List%") do findstr /c:"%%F" %tmp%>>%wrk%
for /f "usebackq tokens=* delims=" %%F in (%wrk%) do (
copy /b /y "%%F" "%Dst%" >nul 2>nul
del /q "%%F"
if errorlevel 1 (echo Can`t copy %%F to "%Dst%">>%log%) else (echo File %%F copied>>%log%)
)
del /f %tmp%
del /f %wrk%
del /f %log%
del /q baselist.ext
move *.txt Error
cd Error
dir /b >> c:\365-P\For_check\errorlist.ext
Тело кода позаимствовал. Понял только как задать переменную. А вот все, что творит батник от команды "findstr" до "move" мне не понятно.
После этого начинается вторая часть задачи. Найти "пару" для каждого неверного ответа (где отсутствует строка 20@@@) и выгрузить оба файла в одну директорию.
Iska, попробовал Ваш код, но не могу разобраться, дабы подбить батник под свои цели. Но все равно спасибо.
Подскажите, что означает %слово% заключенное в проценты? 2>nul?
Подскажите, что означает %слово% заключенное в проценты? 2>nul? »
В каком контексте?
Grammaton Cleric
17-02-2012, 09:07
unw1ck3d, обычно слово заключенное в "проценты" - это переменная. То есть:
Простой пример... Есть такая переменная - date - она, по умолчанию, равна текущей дате...
Echo date
даст на выход слово "date"
а вот
echo %date%
в моем случае, на момент написания сообщения даст результат "17.02.2012"
и, для примера...
set segod=segodnya %date%
Это мы создаем переменную "segod" со значением равным слову segodnya и, через пробел, текущей дате...
То есть
Echo %segod%
на выходе даст "segodnya 17.02.2012", только без кавычек...
Обычно так... про другие случаи я не знаю :)
Komoliddin_Fuzaylitdinov@fb
19-08-2019, 14:44
Помогите пожалуйста...
есть путь %PROGRAMFILES(X86)%\Kaspersky Lab\Kaspersky Free 18.0.0
версия (18.0.0) может бит 19.0.0 или 20.0.0
как определить версию и вести в set version=
Komoliddin_Fuzaylitdinov@fb, а что в реестре?
megaloman
19-08-2019, 16:57
Komoliddin_Fuzaylitdinov@fb, @Echo Off
Set "Kasp=%PROGRAMFILES(X86)%"
If "%Kasp%"=="" Set "Kasp=%ProgramFiles%"
Set "Kasp=%Kasp%\Kaspersky Lab"
FOR /F "usebackq delims=" %%d IN (`2^>NUL Dir /A:D /B "%Kasp%\Kaspersky Free *.*"`) DO Set "KaspV=%%d"
Set "KaspV=%KaspV:Kaspersky Free =%"
Echo %KaspV%
Exit /B
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.