Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск файла с похожим именем (http://forum.oszone.net/showthread.php?t=227813)

unw1ck3d 14-02-2012 10:10 1858317

Поиск файла с похожим именем
 
Добрый день

Слабо еще знаком с команадми
Прошу Вашей помощи в решении рабочей задачки

Есть файл (KWTFCB_123.txt) в начале имени которого присутствует всегда один и тот же набор символов "KWTFCB", нумерация соответственно меняется. Это ответ на ранее посланный файл 123.txt.
В виду того, что количество этих сообщений огромно. Необходимо сделать батник, который будет брать за основу KWTFCB_123.txt и находить его пару 123.txt в другой директории.

Спасибо.

megaloman 14-02-2012 16:28 1858621

Найти элементарно, но зачем? Что потом с этой парой файлов делать? А что делать, если соответствие не найдено? Какую утилитарную задачу Вы хотите решить?

Iska 14-02-2012 16:49 1858643

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 1859130

megaloman, прошу меня простить, умолчал
задача сводиться к тому, что при успешном нахождении пары файлов выкидывать оба *.txt в третью директорию. Если же соответствие не найдено, то ничего не делать.
Причем KWTFCB_123.txt лежат все в одной директории, а поиск 123.txt происходит в многоуровневой директории.
Как можно производить поиск 123.txt в директории по всем папкам данной директории?

На самом деле задача еще больше. Первую часть мне удалось решить, а вот со второй частью справиться не хватило знаний. Команда help и все "вытекающие" мне не ясны.
Прошу Вас подсказать с какой литературой ознакомиться. Не могу понять операции с переменными.

На тот вопрос, который я задал Вам, мне предлагали решить задачу на C#.

Iska, спасибо за помощь!!!

Есть еще один вопрос. Есть ли возможность в батниках делать запрос на ввод с клавиатуры, для того, чтобы именовать файлы?

Спасибо.

Anonymоus 15-02-2012 09:01 1859133

unw1ck3d, да, можно.
Код:

Set /P Var=Enter filename: ^>
Данный код выводит в консоль приглашение с текстом "Enter filename: >" и после ввода присваивает введённое значение переменной Var.
Ещё можете почитать Set /?

megaloman 15-02-2012 11:15 1859210

Вариант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 1859349

Полная задача выглядит так:

В исходной директории с:\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?

Iska 15-02-2012 15:50 1859418

Цитата:

Цитата unw1ck3d
Подскажите, что означает %слово% заключенное в проценты? 2>nul? »

В каком контексте?

Grammaton Cleric 17-02-2012 09:07 1860642

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 2884729

Помогите пожалуйста...
есть путь %PROGRAMFILES(X86)%\Kaspersky Lab\Kaspersky Free 18.0.0
версия (18.0.0) может бит 19.0.0 или 20.0.0
как определить версию и вести в
Код:

set version=

Iska 19-08-2019 15:26 2884736

Komoliddin_Fuzaylitdinov@fb, а что в реестре?

megaloman 19-08-2019 16:57 2884745

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



Время: 22:00.

Время: 22:00.
© OSzone.net 2001-